2016-07-10 13 views
0

Könnten Sie das Verhalten von Iterator Ergebnis erklären:Java Iterator nextindex Zeiger

ArrayList<String> list = new ArrayList< >(
      Arrays.asList(new String[] { "a", "b", "c", "d" })); 
    int i = 0; 
    ListIterator<String> iterator = list.listIterator(); 
    while(iterator.hasNext()) { 
     if(++i == 3) { 
      System.out.println(
        iterator.previous() + iterator.nextIndex()); 
     } 
     System.out.println(iterator.next() + iterator.nextIndex()); 
    } 

Der Ausgang ist: a1 b2 b1 b2 c3 d4 Warum dritte Ausgabe ist "b1", aber nicht "a1"? I Figur, die die Struktur

0 1 2 3 Elementindex

a b c d Elementwert

+0

'nextIndex' ist der Index, der durch Aufruf von' next() 'zurückgegeben werden soll. Beantwortet das deine Frage? –

+0

@BoristheSpider Ich habe ein bisschen die Frage ändern – pswrdf

+1

BTW: Sie brauchen nicht die 'neue String [] {...}', können Sie einfach 'Arrays verwenden.asList ("a", "b", "c", "d") '. –

Antwort

4

die Javadoc- Siehe zum ListIterator:

A ListIterator kein aktuelles Element hat; seine Cursorposition liegt immer zwischen dem Element, das von einem Aufruf an previous() zurückgegeben würde, und dem Element, das von einem Aufruf an next() zurückgegeben würde.

Und ListIterator.previous():

Gibt das vorherige Element in der Liste aus und bewegt den Cursor-Position nach hinten ... (Beachten Sie, dass Anrufe an next und previous abwechselnd das gleiche Element zurückkehren wiederholt.)

Du nennst previous() zwischen b und c, die die previo zurück us-Element (b) und setzt den Cursor um eine Position zurück (zwischen a und b), so dass nextIndex() jetzt 1 zurückgibt.

2

Ich denke, es ist am besten erklärt durch die Indexwerte, wie die Trennlinien zwischen den Elementen viewing:

values: | a | b | c | d | 
indizes: 0 1 2 3 4 

next() das Element rechts von der Indexposition zurück und erhöht den Index. previous() gibt das Element links von der Indexposition zurück und dekrementiert den Index.

So in der ersten Iteration ist Index 0, so next() kehrt a und aktualisiert den Index zu 1.

In der zweiten Iteration ist Index 1, so next() kehrt b und aktualisiert den Index zu 2.

In der dritten Iteration, rufen Sie zuerst previous(), die b (links von der Position 2) zurück und aktualisiert den Index zu 1 (die von nextIndex() zurückgeführt wird).

Dann rufen Sie next(), die b wieder zurückgibt (rechts von der Position 1) und aktualisiert den Index auf 2.