ListIterator在next()和previous()的备用调用上重复元素

时间:2018-03-23 09:25:46

标签: java collections iterator listiterator

我编写了下面的程序来迭代列表,但是在备用遍历next() and previous()上它重复了元素。我通过在我的打印逻辑之前放置一个指示符并将其用于extra nextextra previous来了解修复程序。但我想知道为什么行为是这样的,迭代器工作背后的算法是什么。

我已经检查了javaDoc,并在那里写了像

  

下一步
  返回列表中的下一个元素。可以调用此方法   反复遍历列表,或混合调用   以前来回走动。 (注意交替拨打下一个   和之前将重复返回相同的元素。)

但问题是为什么?这样做的逻辑或目的是什么?

public class IterateLinkedListUsingListIterator {

public static void main(String[] args) throws NumberFormatException,
        IOException {
    LinkedList lList = new LinkedList();

    lList.add("1");
    lList.add("2");
    lList.add("3");
    lList.add("4");
    lList.add("5");

    ListIterator itr = lList.listIterator();
    boolean ch = true;

    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    while (ch) {
        System.out.println("Enter choice");
        int chi = Integer.parseInt(br.readLine());
        switch (chi) {
        case 1:
            if (itr.hasNext()) {
                System.out.println(itr.next());
            }
            break;
        case 2:

            if (itr.hasPrevious()) {
                System.out.println(itr.previous());
            }
            break;

        default:
            ch = false;
        }

    }

}

}
按照@vincrichaud的回答和 java doc 语句光标点之间的元素不在元素上,为什么会这样呢?是否有任何具体原因。

                     Element(0)   Element(1)   Element(2)   ... Element(n-1)
cursor positions:  ^            ^            ^            ^                  ^

1 个答案:

答案 0 :(得分:0)

正如doc

中所述
  

下一步返回列表中的下一个元素并前进光标位置。

     

上一页返回列表中的上一个元素并向后移动光标位置。

不明显的是光标位置始终在元素之间而不在元素之间。它也在文档中描述。

  

ListIterator没有当前元素;它的光标位置总是位于元素

之间

知道这一点,很明显,当您拨打next()previous()时,您将获得相同的元素。

LinkedList lList = new LinkedList();
lList.add("1");
lList.add("2");
lList.add("3");
lList.add("4");
lList.add("5");
//lList look like [1,2,3,4,5]
ListIterator itr = lList.listIterator(); //create iterator at position before element 0

itr.next() // return the next element => so return "1"
           // And advance the cursor position => position between element 0 and element 1

itr.previous(); // return the previous element => so return "1"
           // And step back the cursor position => position before element 0