2012-10-26 26 views
2

我只是有一個關於迭代器的快速問題。迭代器hasNext手段列表從不爲空

我當前想要從兩個對象列表中刪除重複項目。

我現在設置的方式是,只要第二個列表(需要從第一個列表中刪除的對象的列表)包含項目,合併的循環將繼續運行。

我一直在使用hasNext()函數來檢查是否還有物品,但我認爲可能存在一個小問題。

當迭代器指向列表中的最後一項並調用hasNext()時,它將返回false,因爲最後一項之後沒有任何內容。這意味着該項目不會從第一個列表中刪除。真的嗎?

下面的代碼:

for (Iterator<Card> discardItr = discard.iterator(); discardItr.hasNext();) 
{ 
    Card tempDiscard = discardItr.next(); 

    Iterator<Card> mixedItr = mixedHand.iterator(); 
    while (mixedItr.hasNext()) 
    { 
     if (tempDiscard.equals(mixedItr.next())) 
     { 
      discardItr.remove(); 
      mixedItr.remove(); 
     } 
    } 

} 
+0

'hasNext()'是真實的,如果(你當然會已經通過只是想它發現)並且只有在後續調用next()時纔會成功。 –

+0

這是否意味着即使列表中還有一個項目,它會返回true?例如, 。 [1,2,3] 即使在最後一個項目3,它也會返回true嗎? –

+0

你覺得,下一個()會給你最後一個元素嗎? –

回答

2

即使您致電iterator#removeIterator也會遍歷整個列表。例如運行

public class IteratorDemo { 
    public static void main(String[] args) { 
    List<String> list = new ArrayList<>(); 
    list.addAll(Arrays.asList("first", "second", "third")); 
    Iterator<String> iterator = list.iterator(); 
    while (iterator.hasNext()) { 
     String next = iterator.next(); 
     System.out.println(next); 
     iterator.remove(); 
    } 
    } 
} 

產生以下輸出

first 
second 
third 

所以,你的代碼將工作

0

如果數據集是小,你可以使用Set而不是List,你可以用下面的代碼,這是非常簡單和清晰,但需要更多的內存:

Set<Card> discardCopy = new HashSet<Card>(discard); 
Set<Card> mixedCopy = new HashSet<Card>(mixedHand); 
mixedHand.removeAll(discardCopy); 
discard.removeAll(mixedCopy);