我有以下代码:
LinkedList<String> list = new LinkedList<String>();
list.add("1");
list.add("2");
list.add("3");
list.add("4");
list.add("5");
list.add("6");
ListIterator<String> iterator = list.listIterator();
String str = iterator.next();
System.out.println(str);
str = iterator.next();
System.out.println(str);
str = iterator.next();
System.out.println(str);
System.out.println("switch direction");
str = iterator.previous();
System.out.println(str);
str = iterator.previous();
System.out.println(str);
输出是这样的:
1
2
3
switch direction
3
2
我希望在第一次 iterator.previous()调用中打印 2 ,但事实并非如此。它给了我相同的元素,就像这个函数在第一次调用时什么也没做。
如果我从最后一次开始到第一次迭代,同样的事情发生,我将中间的方向改回到最后一次。
是否存在设计原因,或者它只是Java列表迭代器中的错误?
我正在使用:
java version "1.6.0_45"
Java(TM) SE Runtime Environment (build 1.6.0_45-b06)
Java HotSpot(TM) 64-Bit Server VM (build 20.45-b01, mixed mode)
答案 0 :(得分:8)
来自Javadoc
(请注意,对
next
和previous
的交替呼叫将返回相同的呼叫 元素反复。)
javadoc还描述了
长度为n的列表的迭代器有n + 1个可能的光标位置, 如下面的插入符号(^)所示:
Element(0) Element(1) Element(2) ... Element(n-1)
cursor positions: ^ ^ ^ ^ ^
如果光标位于Element(0)
之前,而您执行next()
,则会消耗Element(0)
并向前移动。当你执行previous
时,它会再次消耗Element(0)
,然后移动。
答案 1 :(得分:2)
根据Javadocs for ListIteator
's previous
method,它是设计的。
返回列表中的上一个元素并向后移动光标位置。可以重复调用此方法以向后遍历列表,或者与调用next()混合以来回传递。 (请注意,对next和previous的交替调用将重复返回相同的元素。)
您可以将迭代器的当前位置视为紧接在要返回的下一个项目之前,并且紧接在要返回的上一个项目之后。
第一次打印next
后,在previous
之后,但在第一次3
之前的可视化:
[ "1" ] [ "2" ] [ "3" ] [ "4 "]
^
第一次previous
后的可视化,第二次打印3
时:
[ "1" ] [ "2" ] [ "3" ] [ "4 "]
^
(这就是ListIterator
javadocs描述当前位置的方式。)