Java ListIterator 中的哪个元素被认为是先前的?

Posted

技术标签:

【中文标题】Java ListIterator 中的哪个元素被认为是先前的?【英文标题】:Java which element in the ListIterator is considered previous? 【发布时间】:2014-07-02 19:56:05 【问题描述】:

我目前正在尝试学习如何实现我自己的 ListIterators。我已经实现了大部分并准备好了,除了我对 previous() 方法感到困惑。按照标准约定,我能否解释一下 previous() 通常是如何解释的。

即:

             >cursor<
dog     cat    fish     bird     frog    snake

根据 Oracles Java Platform 7 API:

E 前一个()

返回列表中的前一个元素并将光标位置向后移动。可以重复调用此方法以向后迭代列表,或与调用 next() 混合以来回移动。 (注意,交替调用 next 和 previous 将重复返回相同的元素。)

我不太明白的是,如果调用 previous(),它会返回 'fish' 还是 'cat'。

我从两个方面理解它:

1) 'fish' 是您之前所在的对象

2) 'cat' 是在数字上在 'fish' 索引之前的索引处的对象

如果previous返回'fish',那么remove()是否真的删除了相同的元素而不管遍历的方向?

【问题讨论】:

【参考方案1】:

最容易将光标想象为两个元素之间。所以一开始,它是 before dog。调用next() 返回dog,并将其移动到dogcat 之间,等等。当光标 snake 之后,您已经完成了迭代。

所以next() 总是返回光标后的值,并将光标移动到之后的位置。 previous() 总是返回光标之前的值,并将光标移动到之前的位置。

编辑:正如大卫康拉德在 cmets 中所指出的:remove() 总是删除next()previous() 返回的最后一个值。就我上面解释的方式而言,这可能是最不明显的部分......使用您描述的那种“on item”光标来模拟这种行为要容易得多。

【讨论】:

remove() 总是删除next()previous() 返回的最后一个值,以回答问题最后一句中提出的问题。 哇。这是一个非常简单易懂的答案。非常感谢。 @DavidConrad:谢谢,我错过了这一点。会加进去的。【参考方案2】:

ListIterator 很棘手,因为指针的定义有点不同。

Java 7 文档说:

ListIterator 没有当前元素;它的光标位置始终位于调用 previous() 将返回的元素与调用 next() 将返回的元素之间。

可能的光标位置是(用星号表示):

*     *     *     *     *     *     *
  dog   cat  fish  bird  frog  snake

next 函数将光标前移一位并返回以下元素之间的元素:

BEFORE:
*     *     v     *     *     *     *
  dog   cat  fish  bird  frog  snake
AFTER:
*     *     *     v     *     *     *
  dog   cat  FISH  bird  frog  snake
RETURNED: fish

previous 函数会将光标向后移动并返回以下元素:

BEFORE:
*     *     *     *     *     v     *
  dog   cat  fish  bird  frog  snake
AFTER:
*     *     *     *     v     *     *
  dog   cat  fish  bird  FROG  snake
RETURNED: frog

【讨论】:

以上是关于Java ListIterator 中的哪个元素被认为是先前的?的主要内容,如果未能解决你的问题,请参考以下文章

java.util.ListIterator

java:集合输出之Iterator和ListIterator

java 列表迭代器

Java ListIterator(迭代器)

Java 集合系列—— ListIterator 源码分析

Java集合框架学习总结