【问题标题】:Why Java's list iterator is not returning the right element when changing direction为什么Java的列表迭代器在改变方向时没有返回正确的元素
【发布时间】:2015-04-03 02:04:36
【问题描述】:

我有以下代码:

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)

【问题讨论】:

    标签: java arrays list iterator listiterator


    【解决方案1】:

    来自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),并移到后面。

    【讨论】:

    • 同样来自 Javadoc:ListIterator 没有当前元素;它的光标位置始终位于调用 previous() 将返回的元素与调用 next() 将返回的元素之间
    【解决方案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 描述当前位置的方式。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-21
      • 2023-03-03
      • 2014-04-11
      • 2020-03-26
      • 2013-09-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多