In Java gibt es die SortedSet
und SortedMap
Schnittstellen. Beide gehören zum Java Collections-Framework und bieten eine sortierte Möglichkeit, auf die Elemente zuzugreifen.
Nach meinem Verständnis gibt es jedoch kein SortedList
Java. Sie können java.util.Collections.sort()
eine Liste sortieren.
Irgendeine Idee, warum es so gestaltet ist?
java
sorting
collections
Jijoy
quelle
quelle
int diff = this.score - that.score;
return (diff == 0) ? 1 : diff;
.Antworten:
Listeniteratoren garantieren in erster Linie, dass Sie die Elemente der Liste in der internen Reihenfolge der Liste (auch bekannt als Einfügereihenfolge ) erhalten. Genauer gesagt in der Reihenfolge, in der Sie die Elemente eingefügt haben oder wie Sie die Liste bearbeitet haben. Das Sortieren kann als Manipulation der Datenstruktur angesehen werden, und es gibt verschiedene Möglichkeiten, die Liste zu sortieren.
Ich werde die Wege in der Reihenfolge ihrer Nützlichkeit ordnen, wie ich es persönlich sehe:
1. Erwägen Sie stattdessen die Verwendung von
Set
oderBag
SammlungenHINWEIS: Ich habe diese Option oben platziert, da Sie dies normalerweise sowieso tun möchten.
Ein sortierter Satz sortiert die Sammlung beim Einfügen automatisch. Dies bedeutet, dass die Sortierung durchgeführt wird, während Sie der Sammlung Elemente hinzufügen. Dies bedeutet auch, dass Sie es nicht manuell sortieren müssen.
Wenn Sie sicher sind, dass Sie sich keine Gedanken über doppelte Elemente machen müssen (oder haben), können Sie
TreeSet<T>
stattdessen das verwenden. Es implementiertSortedSet
undNavigableSet
verbindet und funktioniert so, wie Sie es wahrscheinlich von einer Liste erwarten würden:Wenn Sie die natürliche Reihenfolge nicht möchten, können Sie den Konstruktorparameter verwenden, der a akzeptiert
Comparator<T>
.Alternativ Sie können Multimengen (auch bekannt als Beutel ) , das ist eine ,
Set
die doppelten Elemente erlaubt es , statt und es gibt Drittanbieter - Implementierungen von ihnen. Vor allem aus den Guava-Bibliotheken gibt es eineTreeMultiset
, die sehr ähnlich funktioniert wie dieTreeSet
.2. Sortieren Sie Ihre Liste mit
Collections.sort()
Wie oben erwähnt, ist das Sortieren von
List
s eine Manipulation der Datenstruktur. In Situationen, in denen Sie "eine Quelle der Wahrheit" benötigen, die auf verschiedene Arten sortiert wird, ist das manuelle Sortieren der richtige Weg.Sie können Ihre Liste mit der
java.util.Collections.sort()
Methode sortieren . Hier ist ein Codebeispiel, wie:Komparatoren verwenden
Ein klarer Vorteil ist, dass Sie
Comparator
in dersort
Methode verwenden können. Java bietet auch einige Implementierungen fürComparator
solche, wie z. B. die,Collator
die für länderspezifische Sortierzeichenfolgen nützlich sind. Hier ist ein Beispiel:Sortieren in gleichzeitigen Umgebungen
Beachten Sie jedoch, dass die Verwendung der
sort
Methode in gleichzeitigen Umgebungen nicht benutzerfreundlich ist, da die Sammlungsinstanz manipuliert wird und Sie stattdessen die Verwendung unveränderlicher Sammlungen in Betracht ziehen sollten. Dies ist etwas, was Guava in derOrdering
Klasse bietet und ist ein einfacher Einzeiler:3. Wickeln Sie Ihre Liste mit ein
java.util.PriorityQueue
Obwohl es in Java keine sortierte Liste gibt, gibt es eine sortierte Warteschlange, die wahrscheinlich genauso gut für Sie funktionieren würde. Es ist die
java.util.PriorityQueue
Klasse.Nico Haase hat in den Kommentaren eine verwandte Frage verlinkt , die auch diese beantwortet.
In einer sortierten Sammlung möchten Sie höchstwahrscheinlich die interne Datenstruktur nicht manipulieren, weshalb PriorityQueue die List-Schnittstelle nicht implementiert (da Sie dadurch direkten Zugriff auf ihre Elemente erhalten).
Vorsichtsmaßnahme für den
PriorityQueue
IteratorDie
PriorityQueue
Klasse implementiert die SchnittstellenIterable<E>
undCollection<E>
, sodass sie wie gewohnt iteriert werden kann. Es ist jedoch nicht garantiert, dass der Iterator Elemente in der sortierten Reihenfolge zurückgibt. Stattdessen müssen Sie (wie Alderath in den Kommentaren hervorhebt) inpoll()
die Warteschlange gestellt werden, bis sie leer ist.Beachten Sie, dass Sie eine Liste über den Konstruktor, der eine beliebige Sammlung akzeptiert, in eine Prioritätswarteschlange konvertieren können :
4. Schreiben Sie Ihre eigene
SortedList
KlasseHINWEIS: Sie sollten dies nicht tun müssen.
Sie können Ihre eigene List-Klasse schreiben, die jedes Mal sortiert wird, wenn Sie ein neues Element hinzufügen. Dies kann abhängig von Ihrer Implementierung ziemlich rechenintensiv werden und ist aus zwei Hauptgründen sinnlos , es sei denn, Sie möchten es als Übung ausführen:
List<E>
Schnittstelle hat, weil dieadd
Methoden sicherstellen sollten, dass sich das Element in dem vom Benutzer angegebenen Index befindet.Wenn Sie dies jedoch als Übung ausführen möchten, verwenden Sie hier ein Codebeispiel, um den Einstieg zu erleichtern. Es wird die
AbstractList
abstrakte Klasse verwendet:Beachten Sie , wenn Sie die Methoden nicht außer Kraft gesetzt haben , Sie benötigen, dann von dem Standardimplementierungen
AbstractList
werfenUnsupportedOperationException
s.quelle
Integer maxVal = prioQueue.peek(prioQueue.size() - 1);
. Zweitens, wenn Sie beabsichtigen, die PriorityQueue einfach als sortierte Liste zu verwenden, klingt es weniger intuitiv,PriorityQueue
im Code zu sehenSortedList
, als es gewesen wäre , wenn eine solche Datenstruktur existiert hätte.Collections.sort()
sogar die Vergleichsfunktion definieren können, die zum Sortieren mithilfe einesComparator
Objekts verwendet wird.Weil das Konzept einer Liste nicht mit dem Konzept einer automatisch sortierten Sammlung kompatibel ist. Der Punkt einer Liste ist, dass nach dem Aufruf
list.add(7, elem)
ein Anruf an zurückgegebenlist.get(7)
wirdelem
. Bei einer automatisch sortierten Liste könnte das Element an einer beliebigen Position landen.quelle
Da alle Listen bereits nach der Reihenfolge "sortiert" sind, in der die Elemente hinzugefügt wurden (FIFO-Reihenfolge), können Sie sie mit einer anderen Reihenfolge "neu sortieren", einschließlich der natürlichen Reihenfolge der Elemente
java.util.Collections.sort()
.BEARBEITEN:
Listen als Datenstrukturen basieren auf der Reihenfolge, in der die Elemente eingefügt wurden.
Sets haben diese Informationen nicht.
Wenn Sie durch Hinzufügen von Zeit bestellen möchten, verwenden Sie
List
. Wenn Sie nach anderen Kriterien bestellen möchten, verwenden SieSortedSet
.quelle
Set und Map sind nichtlineare Datenstrukturen. Liste ist lineare Datenstruktur.
Die Baumdatenstruktur
SortedSet
undSortedMap
Schnittstellen implementiertTreeSet
undTreeMap
jeweils verwendete Verwendung Rot-Schwarz - Baum Implementierung Algorithmus. So wird sichergestellt, dass keine doppelten Elemente (oder Schlüssel im Fall vonMap
) vorhanden sind.List
Wird bereits eine geordnete Sammlung und indexbasierte Datenstruktur gepflegt, sind Bäume keine indexbasierten Datenstrukturen.Tree
per definitionem dürfen keine Duplikate enthalten sein.List
wir Duplikate haben, also gibt es keineTreeList
(dh keineSortedList
).java.util.Collections.sort()
. Es sortiert die angegebene Liste in aufsteigender Reihenfolge entsprechend der natürlichen Reihenfolge ihrer Elemente.quelle
JavaFX
SortedList
Obwohl es eine Weile gedauert hat, hat Java 8 eine sortierte
List
. http://docs.oracle.com/javase/8/javafx/api/javafx/collections/transformation/SortedList.htmlWie Sie in den Javadocs sehen können, ist es Teil der JavaFX- Sammlungen, die eine sortierte Ansicht einer ObservableList bereitstellen sollen.
Update: Beachten Sie, dass mit Java 11 das JavaFX-Toolkit außerhalb des JDK verschoben wurde und jetzt eine separate Bibliothek ist. JavaFX 11 ist als herunterladbares SDK oder bei MavenCentral erhältlich. Siehe https://openjfx.io
quelle
Für alle Neulinge hat Android ab April 2015 eine SortedList- Klasse in der Support-Bibliothek, die speziell für die Arbeit mit entwickelt wurde
RecyclerView
. Hier ist der Blog-Beitrag darüber.quelle
Ein weiterer Punkt ist die zeitliche Komplexität von Einfügeoperationen. Für eine Listeneinfügung erwartet man eine Komplexität von O (1). Dies konnte jedoch mit einer sortierten Liste nicht garantiert werden.
Und der wichtigste Punkt ist, dass Listen nichts über ihre Elemente annehmen. Sie können beispielsweise Listen mit Dingen erstellen, die nicht implementiert sind
equals
odercompare
.quelle
SortedSet
Dinge erstellen, die nicht implementiert werdenComparable
. Siehe diesen TreeSet-Konstruktor .List
Oberfläche garantiert keine Leistungsspezifikationen für ihre Methoden.Stellen Sie sich das so vor: Die
List
Schnittstelle verfügt über Methoden wieadd(int index, E element)
,set(int index, E element)
. Der Vertrag sieht vor, dass Sie ein Element an Position X dort finden, wenn Sie es hinzugefügt haben, es sei denn, Sie fügen zuvor Elemente hinzu oder entfernen sie.Wenn eine Listenimplementierung Elemente in einer anderen Reihenfolge als basierend auf dem Index speichern würde, wären die obigen Listenmethoden nicht sinnvoll.
quelle
Die erste Zeile in der Listen-API besagt, dass es sich um eine geordnete Sammlung handelt (auch als Sequenz bezeichnet). Wenn Sie die Liste sortieren, können Sie die Reihenfolge nicht beibehalten, sodass in Java keine Baumliste vorhanden ist.
Wie API sagt, wurde Java List von Sequence inspiriert und siehe die Sequenzeigenschaften http://en.wikipedia.org/wiki/Sequence_(mathematics )
Dies bedeutet nicht, dass Sie die Liste nicht sortieren können, aber Java entspricht seiner Definition und bietet standardmäßig keine sortierten Versionen von Listen.
quelle
Wenn Sie nach einer Möglichkeit suchen, Elemente zu sortieren, aber auch effizient über einen Index darauf zugreifen können, haben Sie folgende Möglichkeiten:
ArrayList
)Um dann ein Element hinzuzufügen oder zu entfernen, können
Collections.binarySearch
Sie den Einfüge- / Entfernungsindex abrufen. Da Ihre Liste einen Direktzugriff implementiert, können Sie die Liste mit dem ermittelten Index effizient ändern.Beispiel:
quelle
Erwägen Sie die Verwendung einer indizierten Baumkarte . Es handelt sich um ein erweitertes JDK-TreeSet, das den Zugriff auf Elemente über den Index ermöglicht und den Index eines Elements ohne Iteration oder versteckte zugrunde liegende Listen findet, die den Baum sichern. Der Algorithmus basiert auf der Aktualisierung der Gewichte sich ändernder Knoten bei jeder Änderung.
quelle