【问题标题】:How does linklist.iterator().next() work?linklist.iterator().next() 是如何工作的?
【发布时间】:2019-06-07 16:58:26
【问题描述】:

我试图了解迭代器在第一个元素的情况下如何工作。 就像我们第一次调用 iterator.next() 一样,为什么它返回 0 索引而不是 1? 有一个类似的线程在某种程度上回答了这个问题,但它本身的代码似乎不匹配。 How does next() method on iterators work?

通过这段代码,看起来实际上 next 方法返回当前元素并将光标移动到下一个元素。

@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 文档,并将其视为返回当前并移至下一个?

【问题讨论】:

  • 我没有看到与文档的冲突。在这种情况下,您可能不理解“下一步”这个词。它的意思是“下一个可用的数据”。因此,当没有读取以前的项目时,下一个可用的就是第一个。
  • 在您发布的代码中,没有任何内容表明cursor 指向“当前”元素。您在心理上将cursor 和“当前”等同起来,但实际上并非如此。 cursor 只是不影响迭代器接口的实现细节。实现者本可以选择将其初始化为 -1 并相应地更改实现,但显然发现这种方法更简单。

标签: java iterator


【解决方案1】:

当我们第一次调用 iterator.next() 时为什么会这样 返回 0 索引而不是 1?

因为如果列表上的迭代器不允许您迭代底层列表的所有元素,那么它们将存在严重缺陷。

那么考虑这种方法的正确方法是什么?我是不是该 只需忽略 java 文档,并将其视为返回当前并移动 到下一个?

没有。您的心智模型与文档不一致,您应该首先考虑是否是您的模型需要调整。在这种情况下,您可能会得到这个更好的模型:

  • 对于任何迭代器,都有一个可能为空的项目序列,它将对其进行迭代。 next() 方法返回迭代器尚未返回的下一个。

  • 当它适用于Lists 时,将迭代器视为具有 current 元素是没有帮助的。它有一个下一个元素(可能)和一个前一个元素(可能),但没有当前元素。你可以把它想象成指向元素之间,或者之前第一个或最后一个之后。

【讨论】:

  • 谢谢!所以扩展你的第二点会认为当我们初始化一个迭代器时,它指向该列表的第一个元素作为下一个元素/光标,但迭代器本身“悬停”在列表之前并指向它不会错了吗?
  • @Kirill.bpp,是的,这是一种合理的思考方式。
  • 另外,当我编写一个迭代器时,我的变量名称比您提供的代码中的变量名称更清晰。 “光标”这个名字解释了变量的性质,但不是它的意义,我可能会选择更像“nextElementIndex”的东西。
【解决方案2】:

cursor被初始化为0,由于next()返回索引为cursor的元素(递增cursor之前的值,存储在i中),第一次调用next() 返回第一个元素(索引为 0)。

这个迭代器的不变量是cursor 总是保存下一个元素的索引。 因此,每次调用next() 都会返回索引为cursor 的元素,并递增cursor

【讨论】:

    【解决方案3】:

    因为当您还没有看到任何元素时,第一个元素是“下一个”。迭代器的初始位置在第一个元素的前面。

    考虑一下商店里的柜台。柜台后面有一名商店员工,但他还没有接待任何顾客。顾客出现并排成一队。

    没有“当前”客户。没有人被服务。

    该员工现在已准备好接待客户,并呼叫“请下一位客户”。排在最前面的人上前一步。他/她现在是“当前”客户。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多