我们知道
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
有人可以告诉我这是怎么发生的吗?当我“进入”song3
时,
光标不就在那里吗?所以当我做
previous()
时,它会在之前给我那首歌曲?我怎样才能最终以简单的方式理解这个概念?
看看
ListIterator
的javadoc...
Element(0) Element(1) Element(2) ... Element(n-1) cursor positions: ^ ^ ^ ^ ^
在迭代开始时,光标指向第一个元素之前。
调用
next()
(1) 检索光标位置之后的第一个元素,(2) 将光标前进到指向检索到的元素之后。
调用
previous()
(1) 检索光标位置之前的第一个元素,并 (2) 将光标设置为指向检索到的元素之前。
让我们检查一下有问题的第三行和第四行输出之间发生了什么。
第二行输出后迭代器的状态:
"song1" "song2" "song3" "song4"
cursor position: ^
现在再次调用
next()
并输出"song3"
。你的迭代器状态看起来像这样:
"song1" "song2" "song3" "song4"
cursor position: ^
此时您调用
previous()
并再次打印 "song3"
。运行后的迭代器状态如下:
"song1" "song2" "song3" "song4"
cursor position: ^
因为正如文档所说,
next()
为您提供当前元素并将迭代器移动到下一个:
返回列表中的下一个元素并前进光标位置。
当打印
song3
时,cursor 会移动到 song3
之后,然后如果您调用 previous()
,您将获得位于 cursor 之前的元素,因此再次 song3
。