2013-01-18 77 views
1

我需要比較兩個不同大小的Arraylists。比較兩個陣列列表和迭代器

我可以用兩個循環做到這一點 - 但我需要使用迭代器。

第二個循環只迭代一次而不是n次。

while (it.hasNext()) { 
    String ID = (String) Order.get(i).ID(); 
    j = 0;    
    while (o.hasNext()) { 
     String Order = (String) Order.get(j).ID(); 
     if (myOrder.equals(Order)) { 
      //do sth 
     } 
     j++; 
     o.next(); 
    } 
    i++; 
    it.next(); 
} 
+1

您似乎誤解了如何使用迭代器。如果你使用迭代器,你不需要調用'String ID = list.get(i).ID();',你只需調用:'String ID = it.next()。ID();'。 – assylias

+0

*我需要比較*的一些更多細節將會有所幫助。你想檢查它們是否包含相同的對象*或者它們是否在相同的位置包含相同的對象*。 –

+0

如果您正在使用現代編程IDE(如eclipse),請開始使用自動格式化。在閱讀此代碼後,我將不得不再次與我的醫生簽署一份協議:P – brimborium

回答

3

可以使用迭代器比你做一個更簡單的方法:

Iterator<YourThing> firstIt = firstList.iterator(); 
while (firstIt.hasNext()) { 
    String str1 = (String) firstIt.next().ID(); 
    // recreate iterator for second list 
    Iterator<YourThing> secondIt = secondList.iterator(); 
    while (secondIt.hasNext()) { 
    String str2 = (String) secondIt.next().ID(); 
    if (str1.equals(str2)) { 
     //do sth 
    } 
    } 
} 
2

您需要實例迭代器oit例如每次迭代

while (it.hasNext()) { 
    Iterator<String> o = ... 
    while (o.hasNext()) { 
    // ... 
    } 
} 

Nb。你不需要索引變量j。你可以調用o.next()來獲取迭代器引用的列表元素。

1

什麼

List<String> areInBoth = new ArrayList(list1); 
areInBoth.retainAll(list2); 
for (String s : areInBoth) 
    doSomething(); 

你需要調整你的對象的equals方法來比較正確的東西(在你的榜樣的ID)。

+0

他需要重寫'equal()',因爲他正在檢查相同的'ID()'而不是相同的實例。如果你添加這個,這個答案會非常好。 (雖然OP提到他**有**使用迭代器 - 出於任何原因。) – brimborium

+0

謝謝你的注意。我誤解了,我得到了這樣的一句話:「我可以用兩個循環來完成它,但我很失望,除了使用迭代器之外,我不知道任何其他解決方案」。 – Danstahr

+0

你的解決方案非常好,我會把它留在這裏,但我想它不能解決OP的問題。 – brimborium

1
Iterator<Object> it = list1.iterator(); 
while (it.hasNext()) { 
    Object object = it.next(); 
    Iterator<Object> o = list2.iterator(); 
    while (o.hasNext()) { 
     Object other = o.next(); 
     if (object.equals(other)) { 
      //do sth 
     } 
    } 
} 

兩個iterators因爲兩個列表,獲取每個object與檢查下一併獲得下一個項目(hasNext()next() )。