0

在Java中使用迭代器时,最后一个迭代器指向最后一个节点,对吗?值是 null 对吗?那么在使用的时候

iter = myList.listIterator();
sum = 0;
while (iter.hasNext()) {

sum += iter.next();

}

既然最后一个值迭代器指向的是空值,不应该有一个不一样的问题吗?我知道实际上不存在这样的问题,但不知道为什么,请为我解释一下。提前致谢!

编辑:抱歉,太激动了,没有输入完整的代码。

摘要: 希望这对未来的人有所帮助,我在 C++ 中将迭代器视为指针,但实际上即使将迭代器想象为指针,它们也不是指向节点,而是“指向”节点之间的空间(节点前的空间更多精确)如 bmorris591 所述。

4

4 回答 4

3

next()移动IteratorhasNext()只检查是否有下一个。Iterator不“指向”,如果有的话,它指向元素之间的空间。

您可能想阅读迭代器模式

于 2013-03-19T22:09:11.177 回答
0

假设您的列表包含Integer实例,您可以执行以下操作:

Iterator <Integer> iter = myList.listIterator();
int sum = 0;
while (iter.hasNext()) {
    sum += iter.next().intValue();
}

您的代码将在循环的每次迭代中添加每个iter.next()结果sum

iter.hasNext()被调用时,它不是“在第一个值”,而是在第一个值之前 - 然后第一个调用将返回第一个值并将迭代器的内部状态更新为就在第二个值之前(就在第一个值之后)价值)。

当你到达最后时,内部状态正指向最后一个值之后,所以iter.hasNext()返回 false 并且你的循环退出。

现在,如果您的迭代器包含任何null值,它们仍会由对 的调用返回next(),并且您最终会得到 NullPointerException(您可以通过简单的空检查来避免这种情况)。

于 2013-03-19T22:08:23.810 回答
0

当返回时没有null返回元素。IteratorhasNextfalse

从概念上讲,当hasNext返回时false,迭代器已经指向“过去”最后一个元素,但是没有任何东西“过去”最后一个元素,甚至没有null

如果你nexthasNext返回时调用false,那么它不会返回null——它会抛出一个NoSuchElementException.

于 2013-03-19T22:11:53.197 回答
0

迭代器迭代列表。当仍有元素需要迭代时,hasNext() 方法返回 true,当所有元素都已处理完毕时返回 false。一个例子:

内容为 [0,2,4] 的列表:

iter = myList.listIterator();
iter.hasNext(); // true
iter.next(); // returns 0
iter.hasNext(); // true
iter.next(); // returns 2
iter.hasNext(); // true
iter.next(); // returns 4
iter.hasNext(); // false

因此,一个或一个类似的东西没有问题。每当 hasNext() 返回 true 时,仍有元素需要迭代;next() 返回那个元素。

于 2013-03-19T22:12:55.193 回答