Ich möchte eine umgekehrte List#sublist
Listenansicht für eine Liste haben (ähnlich wie bei einer Unterlistenansicht für eine Liste). Gibt es eine Funktion, die diese Funktionalität bietet?
Ich möchte keine Kopie der Liste erstellen oder die Liste ändern.
In diesem Fall wäre es jedoch ausreichend, wenn ich mindestens einen Reverse-Iterator auf eine Liste setzen könnte.
Außerdem weiß ich, wie ich das selbst umsetzen kann. Ich frage nur, ob Java so etwas bereits bietet.
Demo-Implementierung:
static <T> Iterable<T> iterableReverseList(final List<T> l) {
return new Iterable<T>() {
public Iterator<T> iterator() {
return new Iterator<T>() {
ListIterator<T> listIter = l.listIterator(l.size());
public boolean hasNext() { return listIter.hasPrevious(); }
public T next() { return listIter.previous(); }
public void remove() { listIter.remove(); }
};
}
};
}
Ich habe gerade herausgefunden, dass einige List
Implementierungen genau das haben, descendingIterator()
was ich brauche. Obwohl es keine allgemeine solche Implementierung für gibt List
. Was irgendwie seltsam ist, weil die Implementierung, die ich gesehen habe, LinkedList
allgemein genug ist, um mit jeder zu arbeiten List
.
Collections.reverse(list)
Antworten:
Guave bietet dies: Lists.reverse (Liste)
Im Gegensatz
Collections.reverse
dazu ist dies nur eine Ansicht ... es ändert nichts an der Reihenfolge der Elemente in der ursprünglichen Liste. Bei einer ursprünglichen Liste, die geändert werden kann, werden Änderungen sowohl an der ursprünglichen Liste als auch an der Ansicht in der anderen wiedergegeben.quelle
List
) haben, jedoch ohne umgekehrte Methode. Durch das Entfernen wurde die Guave wieder verfügbar.ListIterator.previous()
Verwenden Sie die Methode .clone () in Ihrer Liste. Es wird eine flache Kopie zurückgegeben, was bedeutet, dass es Zeiger auf dieselben Objekte enthält, sodass Sie die Liste nicht kopieren müssen. Dann verwenden Sie einfach Sammlungen.
Ergo,
Wenn Sie ein verwenden
List
und keinen Zugriff darauf habenclone()
, können Sie Folgendes verwendensubList()
:quelle
clone()
Normalerweise würde eine Kopie der Liste erstellt. Sowieso existiertList#clone()
auch nicht.clone()
. Es wird tatsächlich eine vollständige Kopie der Liste erstellt (es wird nur nicht jedes einzelne Objekt in der Liste geklont, aber darüber habe ich nie gesprochen).subList
wird nicht kopiert, sondern bietet nur eine Ansicht der zugrunde liegenden Liste. Wenn Sie diese Ansicht umkehren, wird die zugrunde liegende Liste umgekehrt.Wenn ich richtig verstanden habe, dann ist es eine Codezeile. Es hat bei mir funktioniert.
quelle
Es ist nicht gerade elegant, aber wenn Sie List.listIterator (int index) verwenden, können Sie einen bidirektionalen ListIterator an das Ende der Liste bringen:
quelle
Collections.reverse (nums) ... Es kehrt tatsächlich die Reihenfolge der Elemente um. Der folgende Code sollte sehr geschätzt werden -
Ausgabe: 15,94,83,42,61
quelle
java.util.Deque
hatdescendingIterator()
- wenn duList
einDeque
bist, kannst du das benutzen.quelle
Ich weiß, dass dies ein alter Beitrag ist, aber heute habe ich nach so etwas gesucht. Am Ende habe ich den Code selbst geschrieben:
Nicht empfohlen für lange Listen, dies ist überhaupt nicht optimiert. Es ist eine einfache Lösung für kontrollierte Szenarien (die von mir behandelten Listen enthalten nicht mehr als 100 Elemente).
Hoffe es hilft jemandem.
quelle
Ich benutze das:
so was:
quelle
Sie können dies auch tun:
quelle
Sie können die Position auch umkehren, wenn Sie ein Objekt anfordern:
quelle
Für kleine Listen können wir einen
LinkedList
absteigenden Iterator erstellen und dann verwenden als:quelle
Verwenden Sie
reverse(...)
Methoden derjava.util.Collections
Klasse. Übergeben Sie Ihre Liste als Parameter und Ihre Liste wird umgekehrt.quelle