为什么我需要在 ListIterator 中调用 previous() 两次才能进行“反向”迭代?

问题描述 投票:0回答:2

我们知道

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()
时,它会在之前给我那首歌曲?我怎样才能最终以简单的方式理解这个概念?

java iterator
2个回答
2
投票

看看

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:                      ^

1
投票

因为正如文档所说,

next()
为您提供当前元素并将迭代器移动到下一个:

返回列表中的下一个元素并前进光标位置。

当打印

song3
时,cursor 会移动到
song3
之后,然后如果您调用
previous()
,您将获得位于 cursor 之前的元素,因此再次
song3

© www.soinside.com 2019 - 2024. All rights reserved.