首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java中的迭代器减少了1个混淆

Java中的迭代器减少了1个混淆
EN

Stack Overflow用户
提问于 2013-03-20 06:04:52
回答 4查看 279关注 0票数 0

在Java中使用迭代器时,最后一个迭代器指向最后一个节点,对吗?并且值是空的,对吗?然后在使用

代码语言:javascript
复制
iter = myList.listIterator();
sum = 0;
while (iter.hasNext()) {

sum += iter.next();

}

既然最后一个值迭代器指向的是null,难道不应该有off-by-one问题吗?我知道实际上没有这样的off-by-one问题,但不知道为什么,请给我解释一下。提前感谢!

编辑:对不起,太激动了,没有输入完整的代码。

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-03-20 06:09:11

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

您可能想要阅读有关Iterator Pattern的信息。

票数 3
EN

Stack Overflow用户

发布于 2013-03-20 06:08:24

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

代码语言:javascript
复制
Iterator <Integer> iter = myList.listIterator();
int sum = 0;
while (iter.hasNext()) {
    sum += iter.next().intValue();
}

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

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

当您到达末尾时,内部状态指向紧跟在最后一个值之后,因此iter.hasNext()返回false,您的循环退出。

现在,如果您的迭代器包含任何空值,对next()的调用仍然会返回这些值,您最终会得到一个NullPointerException (可以通过简单的null检查来避免)。

票数 0
EN

Stack Overflow用户

发布于 2013-03-20 06:11:53

Iterator返回false时,没有从hasNext返回false元素。

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

如果在hasNext返回false时调用next,那么它不会返回null --它将抛出NoSuchElementException

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15511397

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档