Ich muss eine Liste in umgekehrter Reihenfolge mit Java durchlaufen.
Also, wo dies vorwärts geht:
for(String string: stringList){
//...do something
}
Gibt es eine Möglichkeit, die stringList in umgekehrter Reihenfolge mit der für jede Syntax zu iterieren ?
Aus Gründen der Klarheit: Ich weiß, wie man eine Liste in umgekehrter Reihenfolge durchläuft, möchte aber (aus Neugier) wissen, wie man es für jeden Stil macht.
Set
abgeleiteten Sammlungen.foreach
garantiert die Iteration in der Reihenfolge des Iterators, der von deriterator()
Methode der Sammlung zurückgegeben wird. docs.oracle.com/javase/1.5.0/docs/guide/language/foreach.htmlAntworten:
Die Collections.reverse-Methode gibt tatsächlich eine neue Liste zurück, in die die Elemente der ursprünglichen Liste in umgekehrter Reihenfolge kopiert wurden. Dies hat also eine O (n) -Leistung in Bezug auf die Größe der ursprünglichen Liste.
Als effizientere Lösung können Sie einen Dekorateur schreiben, der eine umgekehrte Ansicht einer Liste als Iterable darstellt. Der von Ihrem Dekorateur zurückgegebene Iterator verwendet den ListIterator der dekorierten Liste, um die Elemente in umgekehrter Reihenfolge zu durchlaufen.
Beispielsweise:
Und Sie würden es wie folgt verwenden:
quelle
Für eine Liste können Sie die Google Guava-Bibliothek verwenden :
Beachten Sie, dass dies nicht die gesamte Sammlung umkehrt oder etwas Ähnliches tut - es ermöglicht lediglich Iteration und wahlfreien Zugriff in umgekehrter Reihenfolge. Dies ist effizienter, als zuerst die Sammlung umzukehren.
Lists.reverse
Um eine beliebige Iterable umzukehren, müssten Sie alles lesen und dann rückwärts "wiedergeben".
(Wenn Sie nicht bereits verwenden, würde ich durchaus empfehlen Ihnen einen Blick auf die haben Guava . Es ist toll so.)
quelle
Die Liste ist (im Gegensatz zum Set) eine geordnete Sammlung, und wenn Sie sie durchlaufen, bleibt die Bestellung vertraglich erhalten. Ich hätte erwartet, dass ein Stapel in umgekehrter Reihenfolge iteriert, aber leider nicht. Die einfachste Lösung, die ich mir vorstellen kann, ist folgende:
Mir ist klar, dass dies keine "für jede" Schleifenlösung ist. Ich würde lieber die for-Schleife verwenden, als eine neue Bibliothek wie die Google-Sammlungen einzuführen.
Collections.reverse () erledigt den Job ebenfalls, aktualisiert jedoch die Liste, anstatt eine Kopie in umgekehrter Reihenfolge zurückzugeben.
quelle
for each
Syntax fragtDies wird mit der ursprünglichen Liste in Konflikt geraten und muss auch außerhalb der Schleife aufgerufen werden. Außerdem möchten Sie nicht jedes Mal eine Umkehrung durchführen, wenn Sie eine Schleife ausführen. Wäre das wahr, wenn eine der
Iterables.reverse ideas
beiden Methoden angewendet würde?quelle
AFAIK: In der Standardbibliothek gibt es keinen Standard "reverse_iterator", der die Syntax für jede Syntax unterstützt, die bereits ein syntaktischer Zucker ist, den sie spät in die Sprache gebracht haben.
Sie könnten so etwas wie für (Item-Element: myList.clone (). Reverse ()) tun und den zugehörigen Preis bezahlen.
Dies scheint auch ziemlich konsistent mit dem offensichtlichen Phänomen zu sein, dass Sie keine bequemen Möglichkeiten für teure Operationen haben - da eine Liste per Definition eine O (N) -Wahlzugriffskomplexität aufweisen könnte (Sie könnten die Schnittstelle mit einer einzelnen Verbindung implementieren), umgekehrt Die Iteration könnte O (N ^ 2) sein. Wenn Sie eine ArrayList haben, zahlen Sie diesen Preis natürlich nicht.
quelle
Dies kann eine Option sein. Ich hoffe, es gibt einen besseren Weg, um vom letzten Element zu beginnen, als bis zum Ende der while-Schleife.
quelle
Ab dem Kommentar : Sie sollten in der Lage sein, Apache Commons zu verwenden
ReverseListIterator
Wie @rogerdpack sagte , müssen Sie das
ReverseListIterator
als einpackenIterable
.quelle
Nicht ohne einen benutzerdefinierten Code zu schreiben, der Ihnen einen Enumerator gibt, der die Elemente für Sie umkehrt.
Sie sollten dies in Java tun können, indem Sie eine benutzerdefinierte Implementierung von Iterable erstellen, die die Elemente in umgekehrter Reihenfolge zurückgibt.
Dann würden Sie den Wrapper instanziieren (oder die Methode what-have-you aufrufen), die die Iterable-Implementierung zurückgibt, die das Element in der für jede Schleife umkehrt.
quelle
Sie können die Collections-Klasse http://java.sun.com/j2se/1.4.2/docs/api/java/util/Collections.html verwenden , um die Liste umzukehren und dann zu schleifen.
quelle
Sie müssten Ihre Sammlung umkehren, wenn Sie die für jede Syntax sofort verwenden und in umgekehrter Reihenfolge vorgehen möchten.
quelle
Alle obigen Antworten erfüllen nur die Anforderung, entweder durch Umschließen einer anderen Methode oder durch Aufrufen eines Fremdcodes außerhalb;
Hier ist die Lösung, die aus der 4. Ausgabe von Thinking in Java , Kapitel 11.13.1 AdapterMethodIdiom , kopiert wurde .
Hier ist der Code:
quelle
int current = size() - 1
richtig warum nicht dieint current = this.size() - 1
orint current = super.size() - 1
Eine Arbeit um:
Oder mit Guave :
quelle
Auf jeden Fall eine späte Antwort auf diese Frage. Eine Möglichkeit besteht darin, den ListIterator in einer for-Schleife zu verwenden. Es ist nicht so sauber wie die Doppelpunktsyntax, aber es funktioniert.
Das Guthaben für die ListIterator-Syntax lautet "Möglichkeiten zum Durchlaufen einer Liste in Java".
quelle