2012-12-03 7 views
27

Ich muss wissen, wie LinkedList Iterator auf sein erstes Element "zurückgesetzt".java- Reset-Liste Iterator zu ersten Element der Liste

Zum Beispiel:

LinkedList<String> list;

Iterator iter=list.listIterator;

iter.next();

iter.next();

Immer und immer wieder und nach vielen Zügen des Iterators Ich muß "Reset", um die Position Iterator. `

frage ich will, wie ich kann "reset" mein Iterator auf das erste Element

Ich weiß, dass ich Liste Iterator des ersten Elements auf diese Weise erhalten können:

iter= list.listIterator(1);

Ist das die beste Lösung? oder vielleicht habe ich etwas in Oracle Docs verpasst?

+0

Warum nicht einen neuen Iterator erstellen? – reprogrammer

+1

Nun, Sie haben etwas verpasst, wenn Sie mehr als nächste und vielleicht vorher tun müssen, ist Iterator nicht die beste Wahl. Warum müssen Sie zurücksetzen? –

+0

Ich versuche, die Idee der dynamischen Liste in Java zu verstehen. Vor ein paar Wochen habe ich ein Problem mit Session-Variablen auf Jsp Oage. Von EL und Taglibs kann ich eine Methode von Iterator verwenden, aber ich kann es nicht neu definieren (ich habe immer noch wenig Wissen über Jsp, aber ich verbessere es immer noch :)) Was stört es, wenn Sie "Iterator ist nicht die beste Wahl" geschrieben? Kannst du es mir erklären? :) – ognistysztorm

Antwort

16

Am besten wäre LinkedList überhaupt nicht verwenden, in der Regel ist es in allen Disziplinen langsamer und weniger praktisch. (Bei der in erster Linie das Einfügen/Löschen von an der Vorderseite, insbesondere für große Arrays VerketteteListe schneller)

Verwenden ArrayList und iterieren mit

int len = list.size(); 
for (int i = 0; i < len; i++) { 
    Element ele = list.get(i); 
} 

Reset ist trivial, einfach wieder Schleife.
Wenn Sie darauf bestehen, einen Iterator auf verwenden, dann müssen Sie einen neuen Iterator verwenden:

iter = list.listIterator(); 

(ich in meinem Leben nur einmal gesehen ein Vorteil von LinkedList: Ich konnte durch whith einer while-Schleife Schleife und entfernen Sie die erstes Element)

+4

beim Löschen und Einfügen hauptsächlich nach vorne, dann ist LinkedList schneller. – raceworm

+0

Auch das Entfernen von Elementen aus der Mitte ist im Falle von LinkedList schneller. Dies ist der Fall, wenn Sie Elemente mit iterator.remove() durchlaufen und entfernen. ArrayList würde das Verschieben der verbleibenden Elemente erfordern. – Sohaib

+0

@Sohaib, ja hauptsächlich hängt es von der Größe der Liste ab. Bis zu einer bestimmten Anzahl von Elementen System.arraycopy, die intern verwendet C - memcopy, die zum Verschieben des Arrays verwendet wird, ist schneller. Bei einer erweiterten Implementierung wird die zugrundeliegende Implementierung auf die Elementgröße umgestellt. – AlexWien

34

Sie können wieder listIterator Methode aufrufen, eine Instanz von Iterator zeigt auf den Anfang der Liste zu erhalten:

iter = list.listIterator(); 
+3

genial. Es ist nicht sofort offensichtlich, dass dieser Aufruf nicht nur den gleichen Verweis auf den Iterator zurückgibt, den Sie bereits verwenden. Aber ich denke, dass ein Blick in die Quelle auch diese Antwort gelöst hätte. Hier ist ein Link für alle Neugierigen, da dies eine Gewohnheit ist, über die ich versuche, besser zu sein: http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/ util/ArrayList.java # ArrayList.listIterator% 28% 29 – anon58192932

4

Wenn der Auftrag, spielt keine Rolle, können wir rückwärts mit dem gleichen Iterator mit den hasPrevious() und previous() Methoden neu Iterierte:

ListIterator<T> lit = myList.listIterator(); // create just one iterator 

Zunächst sitzt der Iterator am Anfang, wir vorwärts Iteration:

while (lit.hasPrevious()) process2(lit.previous()); // end -> begin 
4

Dies ist:

while (lit.hasNext()) process(lit.next()); // begin -> end 

Dann wird der Iterator am Ende sitzt, können wir rückwärts Iteration tun eine alternative Lösung, aber man könnte argumentieren, dass es nicht genug Wert hinzufügt, um es sich zu lohnen:

import com.google.common.collect.Iterables; 
... 
Iterator<String> iter = Iterables.cycle(list).iterator(); 
if(iter.hasNext()) { 
    str = iter.next(); 
} 

Aufruf hasNext() setzt den Iterator-Cursor an den Anfang zurück, wenn es das Ende ist.

Verwandte Themen