3

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

IE:

             >cursor<
dog     cat    fish     bird     frog    snake

根据 Oracles Java Platform 7 API:

E 前一个()

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

我不太明白的是,如果调用 previous(),它会返回“鱼”还是“猫”。

我以两种方式理解它:

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

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

如果 previous 返回 'fish',那么无论遍历的方向如何,remove() 实际上都会删除相同的元素吗?

4

2 回答 2

6

最容易将光标视为位于两个元素之间。所以一开始,它是before dog。调用next()return dog,并将其移动到 and 之间dogcat等等。当光标位于after snake时,您已经完成了迭代。

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

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

于 2014-07-02T19:58:39.840 回答
1

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
于 2014-07-02T20:04:23.553 回答