2017-01-06 53 views
-1

我有以下代碼顯示如何ListIterator工作,但它似乎由迭代器返回的項目不是我所期望的。java ListIterator不返回預期項目

import java.util.*; 
public class IteratorExample { 

public static void main(String args[]) { 

    ArrayList al = new ArrayList(); 

    al.add("A"); 
    al.add("B"); 
    al.add("C"); 

    ListIterator litr = al.listIterator(); 

    System.out.print(litr.next()); // expect A 
    System.out.print(litr.next()); // expect B 
    System.out.print(litr.next()); // expect C 
    System.out.print(litr.previous()); // expect B 
    System.out.print(litr.previous()); // expect A 
    System.out.print(litr.next());  // expect B 
    System.out.print(litr.previous()); // expect A 
}} 

我期待看到「ABCBABA」,但示例程序給了我「ABCCBBB」。任何人都可以解釋迭代器如何工作?如果我想通過使用迭代器結果「ABCBABA」,我應該怎麼做?

+0

在調用'下一個()'和'得到C' ,之前的結果是'C',所以'previous()'將返回'C'。基本上,當你改變方向時,你會看到剛剛返回的值。如果你不想這樣做,你可以調用'litr.previous()'而不打印出來以忽略該結果。 – khelwood

回答

2

這裏的另一種簡單的方法來理解這種行爲。

next() - >返回下一個元素並將光標前進一個元素,以便光標指向下一個元素的下一個元素。

previous() - >返回前一個元素,並向後移動一個元素,使光標指向前一個元素。

創建列表剛過,迭代器的位置是類似以下內容:

ListIterator litr = al.listIterator(); 

    A B C 
^ 
    System.out.print(litr.next()); // print A and move to next 

    A B C 
    ^
    System.out.print(litr.next()); // print B and move to next 

    A B C 
     ^
    System.out.print(litr.next()); // print C and move to next 

    A B C 
      ^
    System.out.print(litr.previous()); // print previous which is C and move backward 

    A B C 
     ^
    System.out.print(litr.previous()); // print previous which is B and move backward 

    A B C 
    ^
    System.out.print(litr.next());  // print B and move to next 

    A B C 
     ^
    System.out.print(litr.previous()); // print previous which is B and move backward 

    A B C 
    ^

所以輸出正確「ABCCBBB」

1

如果你讀了listIterator.previous(Java文檔),然後在下面的方法是什麼已經提到這回答你的問題:

「返回列表中的前一個元素,此方法可重複調用來遍歷列表向後,或調用next去來回混合(注意交替到下一個和以前的通話將重複返回相同的元素)」

+0

若要添加更多,在next()系列之後第一次調用previous()方法時,它將返回相同的元素。因此你得到了'C'兩次。下一個前一個()將光標向後移動並返回'B'。然後交替previous()和next()方法返回文檔中提到的相同元素。 –

+0

要添加更多的調用'Next()'得到一個元素,然後指向下一個,同樣的事情'previous()'得到一個元素&指向前一個 – Kevorkian

1

一個的ListIterator沒有當前 元素。其遊標位置始終位於 將通過調用previous()返回的元素和 通過調用next()返回的元素之間。對於長度爲n 的列表的迭代器具有n + 1點可能的光標的位置,通過插入記號(^)下面 所示:

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

ListIterator documentation