2016-01-13 59 views
2

如果我運行下面的代碼,它會打印出3次重複的內容,但是當我在while循環中刪除if語句(只是看它會迭代多少次)時,它會啓動一個無限循環。瞭解Java迭代器

實際上這個hasNext()方法是如何工作的?我認爲這隻會迭代5次,因爲我在列表中有5個項目。

public class ExerciseOne { 
    public static void main(String []args){ 
     String []colors = {"MAGENTA","RED","WHITE","BLUE","CYAN"}; 
     List<String> list = new ArrayList<String>(); 
     for(String color : colors) 
      list.add(color); 
     String[] removeColors = {"RED","WHITE","BLUE"}; 
     List<String> removeList = new ArrayList<String>(); 
     for(String color : removeColors) 
      removeList.add(color); 

     removeColors(list,removeList); 
     System.out.printf("%n%nArrayList after calling removeColors:%n"); 
     for(String color : list) 
     { 
      System.out.printf("%s ",color); 
     } 
    } 

    private static void removeColors(Collection<String> collection1, Collection<String> collection2) 
    { 
     Iterator<String> iterator = collection1.iterator(); 

      while(iterator.hasNext()){ 
       if(collection2.contains(iterator.next())) 
        System.out.println("duplicate"); 
      } 
    } 

} 
+4

您是否閱讀過文檔? – tnw

+1

'hasNext'不移動迭代器遊標,'iterator.next()'移動它,所以當你刪除了條件時,你實際上移除了遊標變化 –

+0

當然是的,「如果迭代有更多元素則返回true」,但我無法理解什麼時候它到達列表的末尾,爲什麼它繼續循環,我會嘗試找到一些其他的教程或文檔,因爲那個來自oracles的對我來說不是那麼清楚 – Tano

回答

7

這是很簡單的,其實

while(iterator.hasNext()){ 
    if(collection2.contains(iterator.next())) 
     System.out.println("duplicate"); 
} 

試想一下,迭代器的一個指針列表的元素。

當您撥打next()時,您正在將此指針移動一步。

如果您不移動指針,則hasNext()將始終爲真,因爲您仍位於列表的開頭。

所以你必須調用迭代器的next(),直到列表中沒有任何剩餘的元素。

+1

謝謝,現在我知道了 – Tano

1

如果您刪除了if語句,那麼它會進入無限循環,因爲您的iterator.next()處於if條件。其實iterator.next()是移動指針的api,而不是hasNext()hasNext()只是檢查集合中是否有任何元素。由於刪除if語句也將刪除hasNext api,指向集合的指針不會移動,並且hasNext始終返回true。

如果從if條件中取出iterator.next()並將其移至if條件之上,則即使在刪除if語句後,循環也會迭代5次。

Iterator<String> iterator = collection1.iterator(); 
while(iterator.hasNext()){ 
     String currentColor = iterator.next(); 
     if(collection2.contains(currentColor)){ 
     System.out.println("duplicate"); 
     } 
} 
+0

謝謝埃裏克指出。那是我在SO的第一個回答。我根據你的評論編輯了我的答案,儘管在其他答案中已經正確解釋了它。 –

+0

非常感謝@Erick。 –