2012-02-28 210 views
1

例如,對於列表{1,2,3,4},我必須比較對(1,2),(1,3),(1,4 ),(2,3),(2,4),(3,4)。與正常的方式進行循環是:使用迭代器進行「向下」迭代的優雅方式

for(i=0 ; i<list.size() ; i++){ 
    for(j=i+1 ; j<list.size() ; j++){ 
    //do stuff with list[i] and list[j]; 
    } 
} 

我可以做這樣的事情迭代器(見下文)?

for (int i : list){ 
    for(int j : [list after index i]){ 
    //do stuff with list[i] and list[j]; 
    } 
} 
+1

的[克隆Java中的迭代器?(http://stackoverflow.com/questions/7758202/clone-an-iterator-in-java) – NPE 2012-02-28 13:49:13

回答

0

你可以實現你自己的Iterator來做到這一點。您還必須創建一個簡單的包裝器對象,以便一次返回兩個項目(這非常令人討厭,因爲沒有Java內置的元組類型)。

只需執行Iterator但不會讓您直接在for循環中使用它。你必須做這樣的事情,而不是:

Iterator<MyPairObject> iterator = new MyIterator(list); 
while (iterator.hasNext()) { 
    ... 
} 

不過,如果你繼承你使用,你可以重寫iterator()方法並返回自己的迭代器list類 - 那麼你就可以使用你的自定義列表類,它的迭代器直接在for循環中。

1

也許不是優雅,但可能:

int lastIndex = list.size()-1; 
for (Object i : list) { 
    for (Object j : list.sublist(list.indexOf(i), list.size()-1)) { 
    // do what has to be done 
    } 
} 
+0

可能重複我選擇了'Object'類型從防止與列表索引混淆.. – 2012-02-28 13:55:06

+1

性能很差,'list.indexOf(i)'是一個O(n)操作。使用傳統的for循環更好。 – 2012-02-28 13:56:23

1

由於項目的指數顯然是重要的在這裏,我想你應該堅持使用舊的指數爲基礎的在這種情況下循環。它可能不太漂亮,但它會是明確的。

如果你這樣做了很多,你可以將代碼封裝在一個方法中,並傳遞一個方法來調用每對。

1

這仍然使用嵌套循環,但使用ListIterator來代替。 ListIterator可以通過List接口的listIterator(idx) method獲得。它並不比for循環更優雅,但如果列表不是可以隨機訪問的,例如LinkedList

for (ListIterator i=list.listIterator(); i.hasNext();) { 
    Object a = i.next(); 
    for (Iterator j=list.listIterator(i.previousIndex()); j.hasNext();) { 
     Object b = j.next(); 
    } 
}