【问题标题】:Calling next on an Iterator once vs multiple times在迭代器上调用 next 一次 vs 多次
【发布时间】:2014-06-30 07:23:25
【问题描述】:

为什么第一个版本的代码不起作用

          // returns the longest string in the list (does not work!)

         public static String longest(LinkedList<String> list) {
              Iterator<String> itr = list.iterator();
              String longest = itr.next(); // initialize to first element

              while (itr.hasNext()) {
                  if (itr.next().length() > longest.length()) {
                     longest = itr.next();
                  } 
              }
              return longest;
         }

但是第二个版本的代码会吗?

       // this version of the code is correct

       while (itr.hasNext()) {
           String current = itr.next();
           if (current.length() > longest.length()) {
               longest = current;
           }
       }

【问题讨论】:

  • 在迭代器上调用 .next 会移动到下一个元素。您在 while 循环中调用了它两次。
  • 每次你调用next()你都会得到一个新对象。

标签: java iterator


【解决方案1】:

当您的if 条件为true 时,您将调用next() 两次:

if (itr.next().length() > longest.length()) {
    longest = itr.next();
...

因此,在if 正文中,您将下一个 值的长度(而不是当前值)分配给longest

Iterator.next() 从集合中返回当前值,但同时将迭代器前进到下一个元素。

请注意,如果没有下一个元素,您对 itr.next() 的第二次调用可能会抛出 NoSuchElementException。在您与Iterator.hasNext() 确认是否有可用的下一个元素后,请始终只调用Iterator.next() 一次

更好的是,使用处理所有样板的foreach loop

for (String current : list) {
    ....
    // "current" now points to the current element
}

【讨论】:

    【解决方案2】:

    计算next() 在第一个片段中与第二个片段相比被调用的次数:

    while (itr.hasNext()) {
        if (itr.next().length() > longest.length()) {
            ^^^^^^^^^^
            longest = itr.next();
                      ^^^^^^^^^^
        }
    }
    

    相比

    while (itr.hasNext()) {
        String current = itr.next();
                         ^^^^^^^^^^
        if (current.length() > longest.length()) {
            longest = current;
        }
    }
    

    每次调用itr.next() 时,都会向迭代器推进另一个令牌。因此,在第一个 sn-p 中,您只存储/比较 每个其他 令牌,而在第二个 sn-p 中,您存储/比较 same 令牌。

    【讨论】:

      【解决方案3】:

      因为在第一个代码中,您永远不会写下第一个元素,因为您在调用 next() 时没有使用它。然后你在每个循环中调用next() 2 次,所以你只会得到 1 over 2 的结果

      【讨论】:

        猜你喜欢
        • 2013-04-21
        • 2020-10-26
        • 2014-06-30
        • 1970-01-01
        • 2015-12-05
        • 2017-02-05
        • 1970-01-01
        • 1970-01-01
        • 2011-07-29
        相关资源
        最近更新 更多