迭代器困惑

时间:2015-12-14 18:37:47

标签: java iterator queue

我在整个迭代器概念上遇到了一些麻烦,而在我的一个测验中,我真的无法理解是什么原因。

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());
     }
}

这是代码,问题是输出是什么。当我认为"Me"时,正确答案为"Give"。我不明白整个运行是怎么回事。

这就是我的理解: 它确实有一个next。如果next等于"Give",则会打印出next值。在这种情况下,该值应为“Give”,不应该吗?

有人可以帮我理解这个吗?

3 个答案:

答案 0 :(得分:3)

if语句调用It.next()来检查值,print语句再次调用It.next() ,而不是打印刚刚检查过的值。

所以你看到的内容永远是 "Give"之后的元素。

答案 1 :(得分: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);
}

答案 2 :(得分:1)

正如您从Java文档中看到的那样:

  

     

E next()   返回迭代中的下一个元素。

     

返回:   迭代中的下一个元素

     

抛出:   NoSuchElementException - 如果迭代没有更多元素

所以你的电话:

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

实际上返回“next”值并将Iterator“It”设置为ArrayDeque中的下一个。 如果再次拨打电话,您将更进一步。