为什么Java的列表迭代器在改变方向时没有返回正确的元素

时间:2015-02-03 18:38:59

标签: java arrays list iterator listiterator

我有以下代码:

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)

2 个答案:

答案 0 :(得分:8)

来自Javadoc

  

(请注意,对nextprevious的交替呼叫将返回相同的呼叫   元素反复。)

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描述当前位置的方式。)