为什么第一个版本的代码不起作用
// 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;
}
}
答案 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()
时,都会使迭代器前进另一个令牌。因此,在第一个代码段中,您只存储/比较所有其他令牌,而在第二个代码段中,您存储/比较相同的令牌。