我在整个迭代器概念上遇到了一些麻烦,而在我的一个测验中,我真的无法理解是什么原因。
public static void main(String[] args)
{
Deque<String> SQ1 = new ArrayDeque<String>();
SQ1.add("Give");
SQ1.add("Me");
SQ1.add("The");
SQ1.add("Best");
SQ1.add("Of");
SQ1.add("Both");
SQ1.add("Worlds");
Iterator<String> It = SQ1.iterator();
while(It.hasNext())
{
if(It.next().equals("Give"))
System.out.print(It.next());
}
}
这是代码,问题是输出是什么。当我认为"Me"
时,正确答案为"Give"
。我不明白整个运行是怎么回事。
这就是我的理解:
它确实有一个next
。如果next
等于"Give"
,则会打印出next
值。在这种情况下,该值应为“Give”,不应该吗?
有人可以帮我理解这个吗?
答案 0 :(得分:3)
if语句调用It.next()
来检查值,print语句再次调用It.next()
,而不是打印刚刚检查过的值。
所以你看到的内容永远是 "Give"
之后的元素。
答案 1 :(得分:2)
当我认为这是“给予”时,正确答案是“我”。我不明白整个运行是怎么回事。
是的,代码说明了一个常见的错误。错误是代码告诉迭代器前进到下一个项目并将它提交给我们两次:
Iterator<String> It = SQ1.iterator();
while(It.hasNext())
{
if(It.next().equals("Give"))
// here^^^^^^^^^
System.out.print(It.next());
// and here -------------^^^^^^^^^
}
所以它获得了价值,看它是"Give"
,然后如果该值是"Give"
,它会抛弃它并获得下一个值,这在您的测试中数据为"Me"
。 (请注意,如果 "Give"
是最后一个条目,则对next
的第二次调用会引发错误,因为此时不会有下一个条目。)
要“修复”它并让它显示"Give"
,仍然使用这种循环,你会记住变量中调用的结果,然后在这两个地方使用变量:
Iterator<String> It = SQ1.iterator();
while(It.hasNext())
{
String value = It.next();
if(value.equals("Give"))
System.out.print(value);
}
但是,这是增强型for
循环的用途:您根本不使用It
变量,只需:
for (String value : SQ1) {
if(value.equals("Give"))
System.out.print(value);
}
答案 2 :(得分:1)
正如您从Java文档中看到的那样:
下
E next() 返回迭代中的下一个元素。
返回: 迭代中的下一个元素
抛出: NoSuchElementException - 如果迭代没有更多元素
所以你的电话:
If(It.next().equals("Give"))
实际上返回“next”值并将Iterator“It”设置为ArrayDeque中的下一个。 如果再次拨打电话,您将更进一步。