Sortieren ArrayList mit benutzerdefinierten Objekten durch die Eigenschaft
Habe ich gelesen, Sortieren von ArrayLists mit einem Komparator aber in allen Beispielen die Menschen verwendet werden compareTo
die nach einigen Forschung ist eine Methode für Strings.
Wollte ich Sortieren einer ArrayList mit der benutzerdefinierten Objekte, die durch eine Ihrer Eigenschaften: ein Date-Objekt
(getStartDay()
). Normalerweise Vergleiche ich Sie durch item1.getStartDate().before(item2.getStartDate())
so Frage ich mich, ob ich könnte etwas schreiben wie:
public class CustomComparator {
public boolean compare(Object object1, Object object2) {
return object1.getStartDate().before(object2.getStartDate());
}
}
public class RandomName {
...
Collections.sort(Database.arrayList, new CustomComparator);
...
}
Verwandte: stackoverflow.com/questions/1814095/...
Antwort von @Yishai in diesem post zeigt elegante Nutzung von enum für benutzerdefinierte Sortierung und Sortierung gruppiert (mehrere Argumente) durch die Nutzung der Komparator aufweist.
Antwort von @Yishai in diesem post zeigt elegante Nutzung von enum für benutzerdefinierte Sortierung und Sortierung gruppiert (mehrere Argumente) durch die Nutzung der Komparator aufweist.
InformationsquelleAutor Samuel | 2010-05-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Seit
Date
implementsComparable
, es hat einencompareTo
Methode wieString
tut.So Ihre eigenen
Comparator
könnte wie folgt Aussehen:Den
compare()
Methode muss wieder einint
, also konnten Sie nicht direkt zurückgebenboolean
wie Sie planen, sowieso.Ihre Sortier-code würde nur darüber zu sein, wie du geschrieben hast:
Einen etwas kürzeren Weg zu schreiben, alle diese, wenn Sie nicht brauchen, um verwenden Sie Ihre Komparator, ist, es zu schreiben, als ein inline-anonyme Klasse:
Seit java-8
Können Sie nun schreiben Sie das Letzte Beispiel in einer kürzeren form mit lambda-Ausdruck für die
Comparator
:Sowie
List
hat einesort(Comparator)
Methode, so können Sie diese kürzen noch weiter:Dies ist so eine gängige Redewendung, dass es integrierte Methode zu generieren
Comparator
für eine Klasse mit einerComparable
Schlüssel:Alle diese sind äquivalente Formen.
int
und dass man Sie besser verwendenDate#compareTo()
. Warum dies nicht von Ihnen positiv bewertet werden vor die andere Antwort ist mir schleierhaft. Dieser link kann auch nützlich sein: "Objekt" Bestellung Tutorial an Sun.com.Ich denke, die Antwort am besten sollte auch der richtige Weg, um tun es in Java 8. Sammlungen.sort(list, Comparator.Vergleich(MyObject::getStartDate)); das liest sich besser und ist weniger fehleranfällig. Es ist sehr einfach zu schreiben return o1.getStartDate().compareTo(o1.getStartDate());
Komparator-Klasse soll statisch sein 🙂
besser noch, verwenden Sie
List.sort()
.Diese Lösung funktioniert nicht auf Android-API <24. Haben Sie Jungs wissen, eine Lösung dafür?
InformationsquelleAutor Michael Myers
Klassen, hat eine Natürliche Sortierreihenfolge (eine Klasse Nummer, als Beispiel) implementieren sollten, die Vergleichbare Schnittstelle, während Klassen, die keine natürlichen Sortierreihenfolge (ein Klasse Stuhl, als ein Beispiel) sollten bereitgestellt werden, mit einem Komparator (oder eine anonyme Comparator-Klasse).
Zwei Beispiele:
Verwendung:
einfach machen es öffentlich, und steckte es in seine eigene Datei (vorzugsweise ein eigenes Paket) und Sie werden in der Lage sein, um es überall verwenden in Ihrem Projekt. Keine Notwendigkeit, erstellen Sie eine zusätzliche Klasse!
meinst du eine neue Datei erstellen - nicht die Klasse und den code: "Klasse ChairWeightComparator implements Comparator<Stuhl> {...." ?
genau - aber mit dem key-word
public
vorclass
.InformationsquelleAutor Björn
Zum Sortieren eines
ArrayList
könnten Sie den folgenden code-snippet:Sortiert, sondern gibt den double-Wert für jedes element
InformationsquelleAutor
Ja, Sie können. Es gibt zwei Möglichkeiten, zu vergleichen Elemente, die Vergleichbar - Schnittstelle, und die Komparator - Schnittstelle.
Beide der diese Schnittstellen ermöglichen für verschiedene Verhalten. Vergleichbar können Sie das Objekt handeln, wie Sie eben beschrieben Streicher (in der Tat, String implements Vergleichbar). Der zweite Komparator, können Sie tun, was Sie Fragen zu tun. Sie würde es so machen:
Dazu führen, dass der Sammlungen.sort-Methode zu verwenden, Ihre Vergleicher für die Sortierung Mechanismus. Wenn die Objekte in der ArrayList implementieren vergleichbar sind, können Sie stattdessen etwas wie das hier tun:
Den Sammlungen - Klasse enthält eine Reihe von diese nützliche, gemeinsame Instrumente.
InformationsquelleAutor aperkins
JAVA 8 lambda-Ausdruck
ODER
Collections.sort(studList, Comparator.comparing(Student::getFirstName));
.. oder
studList.sort(Comparator.comparing(Student::getFirstName));
Die Sortierreihenfolge wird immer aufsteigend in Ihrem Fall. Ich habe kümmern sich um die Sortierreihenfolge auch in meinem Beispiel. Danke Meine Herren.
InformationsquelleAutor Sorter
Mit Java 8 können Sie eine Methode Referenz für Ihre Komparator:
InformationsquelleAutor assylias
Da Technologien erscheinen jeden Tag, die Antwort wird in der Zeit zu ändern. Ich warf einen Blick auf LambdaJ und scheint sehr interessant.
Können Sie versuchen, die Lösung dieser Aufgaben mit LambdaJ. Sie können es hier finden: http://code.google.com/p/lambdaj/
Hier haben Sie ein Beispiel:
Art Iterative
Art mit lambda
Natürlich, dass diese Art von Schönheit, die Auswirkungen in der Leistung (Durchschnitt 2 mal), aber finden Sie einen besser lesbaren code?
sollte es nicht... es funktioniert wie erwartet. Es sei denn, Sie verwenden eine neue version mit einem bug, die ich empfehle, poste es im forum. Sowieso, diese Antwort war der post vor java 8, wenn Sie es verwenden, dann wird es viel besser als mit lambdaj
Ich hatte zu entfernen, sogar die Elemente in einer foreach-Schleife andere weisen, es gibt mich doppelt von jedem Inhalt.
InformationsquelleAutor Federico Piazza
Fügen Sie bitte die Erklärung auf deine Antwort.
Einfach kompilieren und ausführen. Der code ist der Kommentar und die Erklärung.
InformationsquelleAutor CharlesW
Besten einfach Weg mit JAVA 8 ist für Englisch Alphabetische Sortierung
Klasse Umsetzung
Art
Wenn Sie möchten, sortiert nach alphabet, enthält nicht-englische Zeichen, die Sie verwenden können, Locale... folgenden code verwenden türkischen Charakter Sortieren...
Klasse Umsetzung
Art
InformationsquelleAutor Beyaz
Funktion & Methode Referenz
Den
Sammlungen.Sortieren
, können Sie die Methode sort eineList
mit einemComparator
Sie übergeben. DassComparator
umgesetzt werden können, mit derKomparator.Vergleich
Methode, wo können Sie ein Methode Referenz als notwendigFunktion
. Zum Glück ist der tatsächliche code ist viel einfacher und kürzer als diese Beschreibung.Für Java 8:
oder
Andere Möglichkeit ist
InformationsquelleAutor Arun
Vom
Java 8
und weiter haben wir nicht verwendenCollections.sort()
direkt.List
- Schnittstelle hat eine voreingestelltesort()
Methode:Sehen http://visvv.blogspot.in/2016/01/sorting-objects-in-java-8.html.
InformationsquelleAutor Vishnu Vasudevan
Können Sie die Bean-Komparator zu Sortieren, die auf jede Eigenschaft in einer benutzerdefinierten Klasse.
InformationsquelleAutor camickr
Ja, das ist möglich, zum Beispiel in diese Antwort ich Sortieren, indem Sie die Eigenschaft
v
von der KlasseIndexValue
Wenn Sie bemerken, hier ich bin die Schaffung einer anonyme innere Klasse ( das ist das Java für Verschlüsse ) und übergeben Sie direkt an den
sort
Methode der KlasseArrays
Wird das Objekt eventuell auch umsetzen
Comparable
( das ist, was die String-und die meisten der core-Bibliotheken, die in Java), aber, dass die Definition der "natürlichen " Sortierreihenfolge" der Klasse selbst, und nicht lassen stecken Sie das neue.Comparator
🙂InformationsquelleAutor OscarRyz
Können Sie versuchen, Guave Bestellen:
InformationsquelleAutor Vitalii Fedorenko
Java 8 Lambda verkürzt die Art.
Collections.sort(stdList, Comparator.comparing(SomeClass::getName));
InformationsquelleAutor javasenior
Sie können die Sortierung, die mit java 8
InformationsquelleAutor Seeker
Fand ich die meisten, wenn nicht alle diese Antworten basieren auf der zugrunde liegenden Klasse (Object) zu implementieren, die vergleichbare oder einen Helfer vergleichbare Schnittstelle.
Nicht mit meiner Lösung! Den folgenden code können Sie vergleichen Objektfeld durch das wissen um die string name. Sie könnten leicht ändern Sie es nicht, den Namen zu verwenden, aber dann müssen Sie es bekannt machen oder den Bau eines der Objekte, die Sie vergleichen möchten gegen.
InformationsquelleAutor Kevin Parker
Diese code-snippets, die nützlich sein könnten. Wenn Sie Sortieren möchten ein Objekt
in meinem Fall möchte ich Sortieren nach VolumeName:
Dieser funktioniert. Ich benutze es in meinem jsp.
InformationsquelleAutor Laura Liparulo
Können Sie einen Blick in diese Präsentation halten Sie auf dem Java Forum in Stuttgart, Deutschland im Jahr 2016.
Nur wenige Folien verwenden der deutschen Sprache, die 99% des Inhalts ist "englischen" Java-source-code; wie
wo
OurCustomComparator
ist mit Standard-Methoden (und andere interessante Ideen). Wie gezeigt, führt zu sehr übersichtlichen code zu Holen einige getter-Methode für die Sortierung und super einfache Verkettung (oder Umkehrung) der Sortierkriterien.Wenn Sie in java8, finden Sie eine Menge von material gibt, um Ihnen den Einstieg.
InformationsquelleAutor GhostCat
Ihre customComparator java-Klasse implementieren muß.util.Komparator, um verwendet zu werden.
es muss auch diesen compare() UND equals()
vergleichen() muss die Frage beantworten: Ist das Objekt 1 kleiner als, gleich oder größer als das Objekt 2?
full docs: http://java.sun.com/j2se/1.5.0/docs/api/java/util/Comparator.html
InformationsquelleAutor Vinny
Mit dieser Bibliothek hier Sie können die Sortierung der Liste der benutzerdefinierten Objekte auf mehreren Säulen. Die Bibliothek nutzt die version 8.0 bietet. Probe ist ebenfalls verfügbar. Hier ist ein Beispiel, das zu tun
InformationsquelleAutor Shriram M.
Neu seit 1.8 ist eine Liste.sort () - Methode anstelle der Verwendung der Sammlung.sort()
so dass Sie direkt anrufen mylistcontainer.sort()
Hier ist ein Codeausschnitt, der zeigt, dass die Liste.sort () - Funktion:
Den Obst-Klasse ist:
InformationsquelleAutor Norbert
Ich bevorzuge diesen Prozess:
Wenn Sie die Liste der Objekte, die hat eine Eigenschaft namens
startDate
rufen Sie dies nicht über und über. Sie können auch Kette SiestartDate.time
.Dies erfordert, dass die Objekt
Comparable
was bedeutet, Sie müssen einecompareTo
,equals
, undhashCode
Umsetzung.Ja, es könnte schneller sein... Aber jetzt müssen Sie nicht haben, um eine neue Komparator für jeden Typ sort. Wenn Sie speichern können auf dev und Zeit geben, auf die Laufzeit, könnte man mit diesem einen.
InformationsquelleAutor DDus
Verwendung von Java 8 verwenden, können Sie definieren die
Comparator
in einer Linie mitComparator.comparing()
Verwenden Sie eine der folgenden Art und Weise:
Option 1:
Option 2:
Nicht genau, nur option 2 hier ist ähnlich wie option 1, die in der genannten Antwort. Ich fühle mich zwei verschiedene Antworten haben kann, wenigstens einige ähnlichkeiten, wenn Sie Antwort auf die gleiche Frage.
InformationsquelleAutor Sahil Chhabra
Ihrer benutzerdefinierten Klasse implementieren kann, die "Vergleichbar" - Schnittstelle, die erfordert eine Implementierung der CompareTo-Methode. In der CompareTo-Methode können Sie dann definieren, was es bedeutet, dass ein Objekt weniger als oder mehr als das andere Objekt. Also in deinem Beispiel, kann es wie folgt Aussehen:
..........
Eine negative Zahl bedeutet, dass diese kleiner ist als das Objekt, das im Vergleich zu. Eine positive Zahl zeigt an, dass diese ist größer als die, im Vergleich zum Objekt und eine Null bedeutet, dass die Objekte gleich sind.
Dann können Sie die Sammlungen.sort(myList) zu Sortieren Sie Ihre Liste ohne Futter in einem Komparator. Diese Methode hat auch den Vorteil, dass Dinge automatisch sortiert, wenn Sie eine geordnete Sammlung von Daten Strukturen wie TreeSet oder einer TreeMap.
Können Sie Lesen Sie diesen Artikel, wenn Sie möchten, um mehr über die Vergleichbare Schnittstelle (Offenlegung: ich bin der Autor 😉 )
https://nullbeans.com/the-java-comparable-interface-automatic-sort-of-collections/
InformationsquelleAutor A.Ebrahim