2015-12-14 70 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),将其从未回答的问题列表中删除。 –