Java 为什么我需要在ListIterator中调用两次previous(),以便进入';反向';迭代?
我们知道什么Java 为什么我需要在ListIterator中调用两次previous(),以便进入';反向';迭代?,java,iterator,next,Java,Iterator,Next,我们知道什么ListIterator有方法next()和previous(),可以在两个方向上遍历。所以我做了一个小程序来尝试 List<String> songs = new ArrayList<>(); songs.add("song1"); songs.add("song2"); songs.add("song3"); songs.add("song4");
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
song3
song2
有人能告诉我这是怎么发生的吗?当我“在”
song3
中时,光标不是在那里吗?所以当我在previous()
中时,它会在那首歌之前给我一首?我怎样才能以简单的方式最终理解这个概念呢?因为正如文档中所说的next()
给出当前元素并将迭代器移动到下一个元素:
返回列表中的下一个元素并前进光标位置
当它打印
song3
时,光标会在song3
之后移动,然后如果调用previous()
,您将在光标之前获得元素,因此再次获得song3
。请查看列表迭代器的
在迭代开始时,光标指向第一个元素之前
调用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: ^
状态:“(请注意,交替调用next和previous将重复返回相同的元素。)”这与迭代器在调用next()
和previous()
时如何移动当前位置有关。我明白了,但这没有意义。为什么有人想把它弄得如此混乱呢?next
实现返回当前项,然后前进。意思是最后一次调用next
后,指针指向song4
previous
首先前进,然后返回值,这意味着指针返回到song3
。如果光标保持在当前迭代器上,这不是更有意义吗?为什么要用这个例子来提升它并使其压倒一切?@Stefan并非JDK的所有方面都是完美设计的。这种实施已经存在了22年。他们不能改变语义,因为这会破坏人们的生活。实际上,我认为我从来没有使用过双向迭代器。@stefan这是因为每个人在迭代时都会这样做,即t[I++]
,获取当前值并移动到下一个值。然后,t[--i]
是相反的。
"song1" "song2" "song3" "song4"
cursor position: ^
"song1" "song2" "song3" "song4"
cursor position: ^