为什么我需要在 ListIterator 中调用 previous() 两次才能进入 'reverse' 迭代?

Why do I need to call previous() twice in ListIterator so I can go in 'reverse' iteration?

我们知道 ListIterator 有什么方法 next()previous() 允许我们在两个方向上 遍历 。所以我做了一个小程序来试试看。

List<String> songs = new ArrayList<>();
   songs.add("song1");
   songs.add("song2");
   songs.add("song3");
   songs.add("song4");

    ListIterator<String> iterator = songs.listIterator();

    System.out.println(iterator.next());
    System.out.println(iterator.next());
    System.out.println(iterator.next());

    System.out.println(iterator.previous());
    System.out.println(iterator.previous());

我期待的是得到:

song1
song2
song3
song2
song1

但我错了。实际结果是这样的:

song1
song2
song3
song3
song2

谁能告诉我这是怎么发生的? cursor 当我 'in' song3 真的在那里时,所以当我 previous() 它给了我歌曲 before 那个?我怎样才能最终以简单的方式理解这个概念?

因为正如文档所说 next() 为您提供当前元素并将迭代器移动到下一个:

Returns the next element in the list and advances the cursor position.

当它打印 song3 时,cursor 被移动到 song3 之后,然后如果你调用 previous() 你会得到元素就在 光标 之前,因此再次 song3

看看 ListIteratorjavadoc...

                     Element(0)   Element(1)   Element(2)   ... Element(n-1)
cursor positions:  ^            ^            ^            ^                  ^

在迭代开始时,光标指向第一个元素之前

next() 的调用 (1) 检索光标位置之后的第一个元素,并且 (2) 将光标前进到检索到的元素之后的点。

调用 previous() (1) 检索光标位置之前的第一个元素,(2) 将光标设置为指向检索到的元素之前。


让我们检查有问题的输出的第 3 行和第 4 行之间发生了什么。

第二行输出后迭代器的状态:

                    "song1"   "song2"   "song3"   "song4"
cursor position:                      ^

现在你再次调用next()并输出"song3"。您的迭代器状态如下所示:

                    "song1"   "song2"   "song3"   "song4"
cursor position:                                ^

此时您调用 previous() 并再次打印 "song3"。运行后的迭代器状态如下:

                    "song1"   "song2"   "song3"   "song4"
cursor position:                      ^