2015-12-14 73 views
2

我在整個迭代器概念方面遇到了一些麻煩,並且在我的一次測驗中遇到了一個問題,我實在無法理解到底發生了什麼。迭代器混淆

public static void main(String[] args) 
{ 
    Deque<String> SQ1 = new ArrayDeque<String>(); 

    SQ1.add("Give"); 
    SQ1.add("Me"); 
    SQ1.add("The"); 
    SQ1.add("Best"); 
    SQ1.add("Of"); 
    SQ1.add("Both"); 
    SQ1.add("Worlds"); 
    Iterator<String> It = SQ1.iterator(); 

    while(It.hasNext()) 
    { 
     if(It.next().equals("Give")) 
      System.out.print(It.next()); 
    } 
} 

這是代碼,問題是輸出是什麼。當我認爲它是"Give"時,正確答案是"Me"。我不明白整個過程如何。

這是我明白的: 它的確有一個next。如果next等於"Give",則會打印出next值。在這種情況下,該值應該是「給」,不是嗎?

有人能幫我理解嗎?

+0

了'if'它調用'下一個()等於內部(。 「Give」)'當它迭代到''Give 「'。然後在打印時,它再次調用'next()',它將它迭代到''我'「。 – Tricky12

+0

謝謝!這是我的理論之一,但我認爲這是沒有道理的。謝謝你爲我清除這些。 – user5666676

+0

'返回迭代中的下一個元素.' - https://docs.oracle.com/javase/7/docs/api/java/util/Iterator.html – Tricky12

回答

3

if語句調用It.next()檢查值,打印語句調用It.next()再次,而不是打印剛剛簽了價值。

所以你看到的將永遠是之後直接"Give"

1

正如你可以從Java文檔看:

下一個

後的下一() 返回迭代的下一個元素。

返回: 在迭代

下一個元素拋出: NoSuchElementException - 如果迭代有沒有更多的元素

所以您的來電:

If(It.next().equals("Give")) 

實際返回「下一個「值並將迭代器'It'設置爲ArrayDeque中的下一個值。 如果你再次打電話,你會更進一步。

2

正確的答案是「我」,當我認爲這是「給」。我不明白整個過程如何。

對,代碼說明了一個常見錯誤。錯誤是代碼告訴迭代器前進到下一個項目,並把它給我們兩次

Iterator<String> It = SQ1.iterator(); 
while(It.hasNext()) 
{ 
    if(It.next().equals("Give")) 
// here^^^^^^^^^ 
     System.out.print(It.next()); 
// and here -------------^^^^^^^^^ 
} 

所以它得到的價值,看它是否是"Give",然後,如果該值是"Give"它會將其丟棄並獲取下一個值,該值在您的測試數據中爲"Me"。 (請注意,如果"Give"是最後一個條目,那麼第二次撥打next會引發錯誤,因爲那時沒有下一個條目。)

「修理」它,並讓它顯示"Give",仍在使用的循環方式,你會記得在一個變量調用的結果,然後用在這兩個地方的變量:

Iterator<String> It = SQ1.iterator(); 
while(It.hasNext()) 
{ 
    String value = It.next(); 

    if(value.equals("Give")) 
     System.out.print(value); 
} 

,這是增強for循環是什麼:您不使用It變量所有,只是:

for (String value : SQ1) { 
    if(value.equals("Give")) 
     System.out.print(value); 
} 
+0

謝謝,你完全回答了我的下一個問題。很好的解釋再次感謝你! – user5666676

+0

@MiguelValdez:很高興幫助!如果這個*回答了你的問題,Stack Overflow的工作方式,你可以通過點擊旁邊的複選標記來「接受」答案。 [詳細信息](/ help/someone-answers),將其從未回答的問題列表中刪除。 –