我目前正在尝试学习如何实现自己的ListIterators。除了我对previous()方法感到困惑之外,我已经实现了大部分并准备好了。按照标准惯例,我可以解释一下通常如何解释previous()。
即:
>cursor<
dog cat fish bird frog snake
根据Oracles Java Platform 7 API:
E previous()
返回列表中的上一个元素并向后移动光标位置。可以重复调用此方法以向后遍历列表,或者与调用next()混合以来回传递。 (请注意,对next和previous的交替调用将重复返回相同的元素。)
我不太明白,如果调用previous(),它会返回'fish'或'cat'。
我以两种方式理解它:
1)'fish'是你之前的对象
2)'cat'是数字上在'fish'索引之前的索引处的对象
如果之前返回'fish',那么remove()实际上是否删除相同的元素而不管遍历的方向?
答案 0 :(得分:5)
最简单的想法是将光标视为两个元素之间的。所以一开始,它是 dog
之前的。致电next()
会返回dog
,并将其移至dog
和cat
之间等。当之后光标时,您已完成迭代> snake
。
所以next()
总是返回光标后的值,然后将光标移动到之后的位置。 previous()
始终在光标之前返回值,并将光标移动到之前的位置。
编辑:正如David Conrad在评论中所指出的那样:remove()
始终会删除next()
或previous()
返回的最后一个值。这可能是最不明显的部分,当涉及到我上面解释过的方式时......使用&#34; on item&#来模拟这种行为要容易得多34;光标你已经描述过了。
答案 1 :(得分: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