如何使listiterator背靠背next()和previous()不返回相同的值?

时间:2017-04-07 16:12:23

标签: java list linked-list listiterator

此测试程序返回评论{ 1, 2, 2, 3, 3 }中的值,但我想更改它,以便我收到{ 1, 2, 1, 2, 3, 2 }。 我发现,listIterator是这样的,因为光标位于这两个值之间:

^1*2*3*4*

星号*是光标所在的位置,^是当前的位置。怎么改呢?

public class LinkedListIteratorTest {
        public static void main(String[] args) {
            LinkedList<Integer> backForw = new LinkedList<Integer>();
            ListIterator<Integer> bFI;

            backForw.add(1);
            backForw.add(2);
            backForw.add(3);
            backForw.add(4);
            bFI = backForw.listIterator();

            System.out.println(bFI.next()); // 1
            System.out.println(bFI.next()); // 2
            System.out.println(bFI.previous()); // 2, how to make it return 1?
            System.out.println(bFI.next()); // 2, if the last one would be 1, this
                                            // should be 2.
            System.out.println(bFI.next()); // 3
            System.out.println(bFI.previous()); // 3, how to make it return 2?
        }
    }

2 个答案:

答案 0 :(得分:1)

使用您的符号,当您第一次调用BFI.next()时,光标的位置为:

  

* 1 ^ 2 * 3 * 4 *

这会返回一个因为光标在向前移动时经过一个光标。在下次调用BFI.next()之后,光标的位置为:

  

* 1 * 2 ^ 3 * 4 *

结果,当你调用BFI.previous()时,光标向后移动一步,经过并返回2并产生以下位置:

  

* 1 ^ 2 * 3 * 4 *

这是LinkedListIterator的正确行为。调用next()然后立即调用previous()应该总是返回相同的值,因为你在迭代同一个元素。

答案 1 :(得分:0)

你做不到。

从概念上讲,Java迭代器的定义是它指向元素之间的空间。当你向前或向后移动迭代器时,它会遍历一个元素并返回该元素,在返回的元素和下一个(或前一个)元素之间停留。

您可以创建自定义迭代器,但任何其他行为都会导致不一致。在沿着这条路走下去之前,问问自己为什么你希望迭代器的行为不同,以及你是否可以调整你的代码来使用当前定义的迭代器。