为什么我需要在 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
。
看看 ListIterator
的 javadoc...
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: ^
我们知道 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
。
看看 ListIterator
的 javadoc...
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: ^