2017-04-07 21 views
0

此测试程序返回评论{ 1, 2, 2, 3, 3 }中的值,但我想对其进行更改,以便我收到{ 1, 2, 1, 2, 3, 2 }。 我发现,是的ListIterator这样,因为光标在这样的值之间:如何使listiterator紧接着()和previous()不会返回相同的值?

^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? 
     } 
    } 
+0

我真的觉得你在这里问错了问题。为什么不问问题如何获得你想要的行为,而不是问怎么打破迭代器? –

+0

有同样的问题。但在回答中看到正确的解释 – Sergey

回答

0

你不能。

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

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

1

使用你的符号,当你不得不BFI.next()光标位置的第一个电话是:

* 1^2 * 3 * 4 *

这将返回一个是因为光标在向前移动时经过了一个。到BFI.next()中的光标的位置的下一个呼叫后是:

* 1 * 2^3 * 4 *

其结果是,当调用BFI.previous()时,光标由一个移回,越过并返回2和导致以下位置:

* 1^2 * 3 * 4 *

这是一个LinkedListItera正确的行为TOR。调用next()然后立即调用previous()应始终返回相同的值,因为您正在遍历相同的元素。

相关问题