【问题标题】:Iterator Confused [duplicate]迭代器困惑[重复]
【发布时间】:2015-12-14 18:37:47
【问题描述】:

我在整个迭代器概念上遇到了一些问题,对于我的一个测验中的一个问题,我真的不明白发生了什么。

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 值。在这种情况下,该值应该是“给予”,不是吗?

有人可以帮我理解一下吗?

【问题讨论】:

  • if 内部,它调用next().equals("Give"),它在迭代到"Give" 时捕获它。然后在打印时,它再次调用next(),将其迭代到"Me"
  • 谢谢!这是我的理论之一,但我认为它没有意义。谢谢你帮我解决这个问题。
  • Returns the next element in the iteration. - docs.oracle.com/javase/7/docs/api/java/util/Iterator.html
  • 此外,在标准 Java 编码约定中,局部变量不以大写字母开头。

标签: java iterator queue


【解决方案1】:

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

所以你看到的总是直接在 "Give"之后的元素。

【讨论】:

    【解决方案2】:

    当我认为是“给予”时,正确的答案是“我”。我不明白整个过程是如何进行的。

    是的,代码说明了一个常见错误。错误在于代码告诉迭代器前进到下一项并将其提供给我们两次

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

    所以它正在获取值,查看它是否为"Give",然后如果该值为"Give",它会将其丢弃并获取下一个值,在您的测试数据中为@987654325 @。 (请注意,如果 "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);
    }
    

    【讨论】:

    • 谢谢您,您完全回答了我的下一个问题。很好的解释再次感谢您!
    • @MiguelValdez:很高兴有帮助!如果这回答了您的问题,Stack Overflow 的工作方式,您将通过单击旁边的复选标记“接受”答案; details here,将其从未回答的问题列表中删除。
    【解决方案3】:

    您可以从 Java 文档中看到:

    下一个

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

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

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

    所以你的电话:

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

    实际上返回“下一个”值并将迭代器“It”设置为 ArrayDeque 中的下一个。 如果您再次调用 next,您将更进一步。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-11
      • 2019-12-24
      • 1970-01-01
      • 1970-01-01
      • 2016-04-08
      • 2011-07-31
      • 2017-03-31
      • 2015-01-19
      相关资源
      最近更新 更多