【问题标题】:trouble using ListIterator for a LinkedList in java在java中使用ListIterator作为LinkedList的麻烦
【发布时间】:2010-07-02 16:36:43
【问题描述】:

是否可以使用 ListIterator 遍历 Java 中的 LL,定期将对象添加到列表中,并按照添加顺序处理列表中的这些项目?

假设我从一个包含单个对象的 LL 开始。我处理这个对象,并决定我想添加两个额外的对象,我想进一步处理(如 FIFO)。直觉上,我从

开始这个过程
while (itr.hasNext()) {
itr.next();
...
itr.add();
}

但是,这似乎很快就崩溃了 - add 实际上是在我当前所在的索引之前添加项目,而不是在 (ListIterator javadoc) 之后。这意味着当我再次点击 while 循环开始时,它实际上并没有识别出添加到 LL 中的内容,因为它实际上需要向后退(.hasPrevious() 而不是.hasNext())才能找到它。但我不能以.hasPrevious() 开始LL(我不认为),因为LL 中的第一项是.next() 项目。

如何干净利落地做到这一点?还是我傻了?

【问题讨论】:

  • 你要实现队列吗?
  • @bears:我不这么认为,因为根据我在 javadoc 中的理解,队列让我可以从前面删除东西,但我实际上需要保留列表中的项目以供以后处理.我可能可以使用两个数据结构来解决这个问题,但我想知道为什么我不能使用这个......
  • 因此,听起来您对特定项目进行了两轮处理;项目按先进先出顺序处理 - 对吗?如果是这样,请使用两个队列。
  • @bears:是的,我可以使用两个队列。我想知道为什么这个特定的课程说它让我做某事时失败了。
  • 该课程没有失败,它正在按照它所说的那样做。

标签: java iterator linked-list


【解决方案1】:

您没有在上面的评论中引用整个定义:

将指定元素插入 列表(可选操作)。元素 紧接在 将返回的下一个元素 下一个,如果有的话,在下一个之后 将返回的元素 以前的,如果有的话。 (如果列表 不包含元素,新元素 成为列表中的唯一元素。) 新元素插入到 隐式游标:后续调用 next 将不受影响,并且 a 随后调用先前将 返回新元素。 (这个电话 将值增加一 通过调用 nextIndex 或返回 以前的索引。)

新项目已插入,因此您必须调用 previous() 才能获取它。

如果您必须在当前迭代点插入项目,那么您将不得不自己进行管理并调用previous(),这将在一定程度上涉及重构循环。

如果您可以将新项目添加到列表的末尾并稍后处理它们,请改用队列实现。

【讨论】:

  • 我想这就是我要找的东西......如果我不能将东西添加到我的列表中并搜索它们,这似乎是一门毫无价值的课程。
  • 实际上,我认为这不是我想要的。我确实提到了(不是在引用中,而是在文本中)。像这样读,这门课对我来说似乎没用。我想知道我是否在解释它的潜在错误。如果确实不可能做我想做的事,那很好,但我想知道我是否只是没有足够创造性地考虑迭代过程。
  • 队列实现了Iterable,所以你不必从队列中删除东西,你仍然可以迭代它。查看 ConcurrentLinkedQueue 类。
  • 我认为这也行不通。我检查了javadocs。我可以删除头项,但是“前进”队列的唯一方法是使用迭代器,如果我正确阅读它,那么关于迭代器崩溃的评论可能适用......我即将放弃并且只需使用两个队列。我认为这会更好,但显然它只是没用。
【解决方案2】:

如果您不打算在循环中执行任何删除操作,您可以在每次调用循环体末尾的add() 时调用一次previous()。这会将光标留在第一个添加的项目之前,然后 next() 在下一次迭代中返回。我不得不说,我觉得必须有更好的方法来做这个处理。

【讨论】:

  • 他必须调用 previous() 两次,因为第一个 previous() 实际上会返回新元素,而 next() 会获取后面的元素。
  • 喜欢让 LL 朝着我正在寻找的方向发展?我同意:(
  • @Jim Garrison 不,第一个previous() 返回新元素并设置光标before 以便后续调用next() 将返回相同的内容。来自 Javadoc:请注意,交替调用 next 和 previous 将重复返回相同的元素。
  • @hatorade 这个类的用例并不典型。请注意,如果此类按您希望的方式工作,则连续两次调用add() 将导致第二个元素被添加第一个元素之前,这与添加到列表的方式相反预计会工作。
  • 感谢您的澄清。你是对的,当然:-)
【解决方案3】:

我相信您必须将添加到列表和迭代列表分开。

【讨论】:

  • @duffymo:来自链接的 javadoc -“列表的迭代器,允许程序员在任一方向遍历列表,在迭代期间修改列表,并获取迭代器在列表中的当前位置。”
  • 根据Sun Java Tutorials:“请注意,Iterator.remove 是在迭代期间修改集合的唯一安全方法;如果基础集合被修改,则行为未指定在迭代过程中以任何其他方式进行。”
  • @bears:sun 写了 ListIterator 类,还是其他人写的?如果是 sun 写的,那么显然这个说法是错误的。
  • 如果您使用 ListIterator,绝对支持 Add。最近有看列表迭代器界面吗?
  • @hatorade:这就是它的定义方式。我听说它不符合您的期望,这让您感到沮丧。但是,还有其他方法可以轻松完成您想要的。
猜你喜欢
  • 2017-03-21
  • 1970-01-01
  • 2012-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-23
相关资源
最近更新 更多