在Iterator上调用next一次vs多次

2 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;
         }
Run Code Online (Sandbox Code Playgroud)

但代码的第二个版本会?

       // this version of the code is correct

       while (itr.hasNext()) {
           String current = itr.next();
           if (current.length() > longest.length()) {
               longest = current;
           }
       }
Run Code Online (Sandbox Code Playgroud)

And*_*ter 7

当你的if情况是true,你打电话next()两次:

if (itr.next().length() > longest.length()) {
    longest = itr.next();
...
Run Code Online (Sandbox Code Playgroud)

因此,在if正文内部,您将分配下一个值的长度,而不是当前值的长度longest.

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

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

更好的是,使用处理所有样板的foreach循环:

for (String current : list) {
    ....
    // "current" now points to the current element
}
Run Code Online (Sandbox Code Playgroud)