2017-01-06 5 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

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 ^ 

ので、出力は当然である:あなたのリストが作成された直後

は、イテレータの位置は、次のようなものです前の結果は 'C'なので' previous() 'は' C'を返します。基本的に、方向を変更すると、戻ったばかりの値が表示されます。あなたが望んでいなければ、 'litr.previous()'を呼び出して、その結果を無視してそれを無視することができます。 – khelwood

答えて

2

ここで、この動作を理解するための別の簡単な方法は次のとおり 以下キャレット(^)で示されるように、長さn のリストについては、反復子は、N + 1つの可能なカーソル位置を有します。

next() - >次の要素を返し、カーソルが次の要素の次を指すように1つの要素だけカーソルを進めます。

previous() - >前の要素を返し、カーソルが1つ前の要素を指すように1つ後ろに移動します。あなたは `次の呼び出し()`と `C`を取得した後、「ABCCBBB」

1

あなたは以下listIterator.previous()メソッドのJavaドキュメントを読めば、あなたの質問に答えるどの言及されたものである。

「リスト内の直前の要素を返します。この方法は、反復処理するために繰り返し呼び出すことができます。後方リスト、または前後に行くには、次の呼び出しと混合(次と前への呼び出しを交互にすることは、繰り返し同じ要素が返されること。)」

+0

さらに、next()メソッドの後にfirst()メソッドを呼び出すと、同じ要素が返されます。したがって、あなたは 'C'を2度得ました。次のprevious()はカーソルを後ろに移動し、 'B'を返します。 previous()メソッドとnext()メソッドを交互に使用すると、docで述べたのと同じ要素が返されました。 –

+0

'Next()'の呼び出しを追加するには、要素を取得し、次の要素をポイントし、 'previous()'と同じことをします。要素を取得し、前の要素をポイントします – Kevorkian

1

A反復子がどんな現在 の要素を持っていません。そのカーソル位置は、previous()の呼び出しによって返される要素 と、next()の呼び出しによって返される要素 との間にあります。

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

ListIterator documentation

関連する問題