我试图了解在第一个元素的情况下迭代器如何工作。 就像我们第一次调用iterator.next()一样,为什么它返回0索引而不是1? 有一个类似的线程在某种程度上回答了这个问题,但是它本身的代码似乎不匹配。 How does next() method on iterators work?
通过此代码,似乎下一个方法实际上返回了当前元素并将光标移至下一个。
@SuppressWarnings("unchecked")
public E next() {
checkForComodification();
int i = cursor;
if (i >= size)
throw new NoSuchElementException();
Object[] elementData = ArrayList.this.elementData;
if (i >= elementData.length)
throw new ConcurrentModificationException();
cursor = i + 1;
return (E) elementData[lastRet = i];
}
那么考虑该方法的正确方法是哪种? 我应该简单地忽略Java文档,并将其视为返回当前值并移至下一个吗?
答案 0 :(得分:1)
就像我们第一次调用iterator.next()的原因一样 返回0索引而不是1?
因为列表上的迭代器如果不允许您迭代基础列表的所有元素,则将存在严重缺陷。
那么考虑该方法的正确方法是哪种?我是不是该 只需忽略Java文档,然后将其视为返回电流并移动 到下一个?
不。您的思维模型与文档不一致,您应该首先考虑是否需要调整模型。在这种情况下,您可能会得出一个更好的模型:
对于任何迭代器,都有可能为空的项目序列会对其进行迭代。 next()
方法返回迭代器尚未返回的下一个。
因为它适用于Lists
,所以将迭代器视为完全具有 current 元素是没有帮助的。它具有下一个元素(也许)和上一个元素(也许),但是没有当前元素。您可以将其视为指向 之间的元素,或者指向 前一个或最后一个。
答案 1 :(得分:0)
cursor
初始化为0
,由于next()
返回索引为cursor
的元素(递增cursor
之前的值,该值被存储在i
中,对next()
的第一次调用返回第一个元素(索引为0
)。
此迭代器的不变之处在于cursor
始终保存下一个元素的索引。
因此,每次对next()
的调用都会返回其索引为cursor
的元素,并递增cursor
。
答案 2 :(得分:0)
因为您还没有看到任何元素,所以第一个元素是'next'。迭代器的初始位置在第一个元素的前面。
考虑商店中的柜台。柜台后面有一家商店的员工,但他尚未接待任何顾客。客户出现并排成一行。
没有“当前”客户。没有人送达。
员工现在可以随时与客户见面,并打电话给“下一位客户”。行首的人向前走。他/她现在是“当前”客户。