在Iterator上调用next一次vs多次

时间:2014-05-12 19:33:14

标签: java iterator

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

          // 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;
           }
       }

3 个答案:

答案 0 :(得分:7)

当您的if条件为true时,您正在拨打next()两次:

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

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

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

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

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

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

答案 1 :(得分:1)

因为在第一个代码中,您永远不会写下第一个元素,因为您在不使用它的情况下调用next()。然后你在每个循环中拨打next() 2次,这样你就不会得到超过2的结果

答案 2 :(得分:0)

计算第一个剪辑中调用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()时,都会使迭代器前进另一个令牌。因此,在第一个代码段中,您只存储/比较所有其他令牌,而在第二个代码段中,您存储/比较相同的令牌。