2016-07-07 26 views
1

假設我有一個TreeSet對象x。我試圖做的是迭代所有對象並獲得所有可能的對。到目前爲止,我已經來到低於獲取TreeSet中所有可能的元素對

TreeSet<x> ts = new TreeSet<>(); 
ts.add(new x(3, true)); 
ts.add(new x(1, true)); 
ts.add(new x(2, true)); 
ts.add(new x(5, true)); 
ts.add(new x(4, true)); 
Iterator<x> iterator = setOfX.iterator(); 
    while (iterator.hasNext()) { 
     System.out.println("ID:"+iterator.next()); 
     Iterator<x> innerIterator = setOfX.tailSet(iterator.next(), true).iterator(); 
     while (innerIterator.hasNext()) { 
      int id = innerIterator.next().id; 
      System.out.println(id); 
     } 
    } 

的代碼,但輸出似乎有些運氣的組合,再加上它有一個例外

ID:1:true 
2 
3 
4 
5 
ID:3:true 
4 
5 
ID:5:true 
Exception in thread "main" java.util.NoSuchElementException 

你能對任何解決點退出?

+2

你提到'TreeMap',但你的代碼是關於'TreeSet'的。這是什麼,地圖或設置? – Jesper

+0

我的錯誤!這是一個TreeSet!修正了。 – Omen

回答

2

問題是,你打電話iterator.next()兩次。請注意,此方法不僅獲取迭代器當前指向的內容,還會將迭代器推進到下一個元素。呼叫iterator.next()每次迭代只有一次,它的返回值存儲在一個變量:

TreeSet<x> ts = new TreeSet<>(); 
ts.add(new x(3, true)); 
ts.add(new x(1, true)); 
ts.add(new x(2, true)); 
ts.add(new x(5, true)); 
ts.add(new x(4, true)); 
Iterator<x> iterator = setOfX.iterator(); 
    while (iterator.hasNext()) { 
     // Call iterator.next() only once per iteration 
     x value = iterator.next(); 

     System.out.println("ID:"+value); 
     Iterator<x> innerIterator = setOfX.tailSet(value, true).iterator(); 
     while (innerIterator.hasNext()) { 
      int id = innerIterator.next().id; 
      System.out.println(id); 
     } 
    } 
+0

謝謝。這是我的錯誤...謝謝指出! – Omen

+1

對不起,我的解決方案几乎是一樣的。可能是我慢慢打字。 –

1

你正在做iterator.next()兩次。創建innerIterator時,其中一個在sysout中。

System.out.println("ID:"+iterator.next()); 

    Iterator<x> innerIterator = setOfX.tailSet(iterator.next(),true).iterator(); 

使用next()的一次iterator.hasNext的每次調用(),你不會有例外。

+0

是的,就是這樣......謝謝你的編輯建議。 – Omen