为什么第一个版本的代码不起作用
// 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)
当你的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)