Was ist der einfachste Weg, um diese ArrayList umzukehren?
ArrayList<Integer> aList = new ArrayList<>();
//Add elements to ArrayList object
aList.add("1");
aList.add("2");
aList.add("3");
aList.add("4");
aList.add("5");
while (aList.listIterator().hasPrevious())
Log.d("reverse", "" + aList.listIterator().previous());
Nicht der einfachste Weg, aber wenn Sie ein Fan von Rekursion sind, könnte Sie die folgende Methode zum Umkehren einer ArrayList interessieren:
Oder nicht rekursiv:
quelle
int j
nicht bei jeder Iteration aktualisiert? Sie initialisieren es auf,j = list.size() - 1
aber ich glaube nicht, dass der Initialisierungsabschnitt vonfor loop
mit jeder Iteration aktualisiert wird, oder?IndexOutOfBoundsException
da Sie versuchen, aufj
den letzten Index der ursprünglichen ArrayList zuzugreifen, aber Sie haben das Objekt an diesem Index bereits entfernt?add()
die anderen Elemente im Array nach unten gedrückt werden, sodass das Array im Wesentlichen eine konstante Größe hat. Interessante Lösungen, danke!Der Trick hier ist die Definition von "umgekehrt". Sie können die Liste an Ort und Stelle ändern, eine Kopie in umgekehrter Reihenfolge erstellen oder eine Ansicht in umgekehrter Reihenfolge erstellen.
Der einfachste Weg, intuitiv zu sprechen , ist
Collections.reverse
:Diese Methode ändert die vorhandene Liste . Das heißt,
Collections.reverse
nimmt die Liste und überschreibt ihre Elemente, wobei keine nicht rückgängig gemachte Kopie zurückbleibt. Dies ist für einige Anwendungsfälle geeignet, für andere jedoch nicht. Außerdem wird davon ausgegangen, dass die Liste geändert werden kann. Wenn das akzeptabel ist, sind wir gut.Wenn nicht, könnte man eine Kopie in umgekehrter Reihenfolge erstellen :
Dieser Ansatz funktioniert, erfordert jedoch ein zweimaliges Durchlaufen der Liste. Der Kopierkonstruktor (
new ArrayList<>(list)
) durchläuft die Liste und dies auchCollections.reverse
. Wir können diese Methode so umschreiben, dass sie nur einmal wiederholt wird, wenn wir dazu neigen:Dies ist effizienter, aber auch ausführlicher.
Alternativ können wir das oben Gesagte umschreiben, um die
stream
API von Java 8 zu verwenden , die einige Leute prägnanter und lesbarer finden als die oben genannten:nb. Das
Collectors.toList()
gibt nur sehr wenige Garantien für die Ergebnisliste. Wenn Sie sicherstellen möchten, dass das Ergebnis als ArrayList zurückgegeben wird, verwenden SieCollectors.toCollection(ArrayList::new)
stattdessen.Die dritte Option besteht darin , eine Ansicht in umgekehrter Reihenfolge zu erstellen . Dies ist eine kompliziertere Lösung und verdient eine weitere Lektüre / eine eigene Frage. Die umgekehrte Methode von Guavas Listen # ist ein praktikabler Ausgangspunkt.
Die Auswahl einer "einfachsten" Implementierung bleibt dem Leser als Übung überlassen.
quelle
Lösung ohne zusätzliche ArrayList oder Kombination von add () - und remove () -Methoden. Beides kann sich negativ auswirken, wenn Sie eine große Liste umkehren müssen.
quelle
quelle
Rekursives Umkehren einer ArrayList und ohne Erstellen einer neuen Liste zum Hinzufügen von Elementen:
quelle
Nur für den Fall, dass wir Java 8 verwenden , können wir Stream verwenden. Die ArrayList ist eine Direktzugriffsliste, und wir können einen Strom von Elementen in umgekehrter Reihenfolge abrufen und ihn dann in einer neuen sammeln
ArrayList
.Der obige Ansatz ist nicht für LinkedList geeignet, da dies kein Direktzugriff ist. Wir können auch nutzen, um dies
instanceof
zu überprüfen.quelle
Wir können dasselbe auch mit Java 8 tun.
quelle
Ein bisschen lesbarer :)
quelle
Eine andere rekursive Lösung
quelle