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
:
Collections.reverse(myList);
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 :
static <T> List<T> reverse(final List<T> list) {
final List<T> result = new ArrayList<>(list);
Collections.reverse(result);
return result;
}
Dieser Ansatz funktioniert, erfordert jedoch ein zweimaliges Durchlaufen der Liste. Der Kopierkonstruktor ( new ArrayList<>(list)
) durchläuft die Liste und dies auch Collections.reverse
. Wir können diese Methode so umschreiben, dass sie nur einmal wiederholt wird, wenn wir dazu neigen:
static <T> List<T> reverse(final List<T> list) {
final int size = list.size();
final int last = size - 1;
// create a new list, with exactly enough initial capacity to hold the (reversed) list
final List<T> result = new ArrayList<>(size);
// iterate through the list in reverse order and append to the result
for (int i = last; i >= 0; --i) {
final T element = list.get(i);
result.add(element);
}
// result now holds a reversed copy of the original list
return result;
}
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:
static <T> List<T> reverse(final List<T> list) {
final int last = list.size() - 1;
return IntStream.rangeClosed(0, last) // a stream of all valid indexes into the list
.map(i -> (last - i)) // reverse order
.mapToObj(list::get) // map each index to a list element
.collect(Collectors.toList()); // wrap them up in a list
}
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 Sie Collectors.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.