Ich habe über das Sortieren von ArrayLists mit einem Komparator gelesen, aber in allen Beispielen wurden Leute verwendet, compareTo
die nach einigen Untersuchungen eine Methode für Strings sind.
Ich wollte eine ArrayList von benutzerdefinierten Objekten nach einer ihrer Eigenschaften sortieren: einem Date-Objekt ( getStartDay()
). Normalerweise vergleiche ich sie mit, item1.getStartDate().before(item2.getStartDate())
also habe ich mich gefragt, ob ich so etwas schreiben könnte:
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);
...
}
java
sorting
date
comparator
Samuel
quelle
quelle
Antworten:
Da
Date
implementiertComparable
, hat es einecompareTo
Methode wieString
tut.Ihr Brauch
Comparator
könnte also so aussehen:Die
compare()
Methode muss ein zurückgebenint
, sodass Sie ein direktes Ergebnis nicht direkt zurückgebenboolean
können.Ihr Sortiercode würde ungefähr so sein, wie Sie geschrieben haben:
Eine etwas kürzere Möglichkeit, dies alles zu schreiben, wenn Sie Ihren Komparator nicht wiederverwenden müssen, besteht darin, ihn als anonyme Inline-Klasse zu schreiben:
Schon seit Java-8
Sie können das letzte Beispiel jetzt in kürzerer Form schreiben, indem Sie einen Lambda-Ausdruck für Folgendes verwenden
Comparator
:Und
List
hat einesort(Comparator)
Methode, so dass Sie diese noch weiter verkürzen können:Dies ist eine so verbreitete Redewendung, dass es eine integrierte Methode gibt , um eine
Comparator
für eine Klasse mit einemComparable
Schlüssel zu generieren :All dies sind äquivalente Formen.
quelle
int
und dass Sie es besser dafür verwenden solltenDate#compareTo()
. Warum dies nicht über der anderen Antwort steht, ist mir ein Rätsel. Dieser Link kann auch nützlich sein: Tutorial zur Objektbestellung bei Sun.com .List.sort()
.Klassen mit einer natürlichen Sortierreihenfolge (z. B. eine Klassennummer) sollten die Schnittstelle Comparable implementieren, während Klassen ohne natürliche Sortierreihenfolge (z. B. ein Klassenstuhl) einen Komparator (oder einen anonymen Komparator) erhalten sollten Klasse).
Zwei Beispiele:
Verwendungszweck:
quelle
public
vorclass
.Zum Sortieren eines können
ArrayList
Sie das folgende Code-Snippet verwenden:quelle
Ja, du kannst. Beim Vergleichen von Elementen gibt es zwei Optionen: die Schnittstelle " Vergleichbar " und die Schnittstelle " Vergleicher ".
Beide Schnittstellen ermöglichen ein unterschiedliches Verhalten. Mit Comparable können Sie das Objekt so verhalten lassen, wie Sie es gerade beschrieben haben (Strings implementiert Comparable). Mit dem zweiten Komparator können Sie das tun, worum Sie bitten. Du würdest es so machen:
Dadurch verwendet die Collections.sort-Methode Ihren Komparator für den Sortiermechanismus. Wenn die Objekte in der ArrayList vergleichbar sind, können Sie stattdessen Folgendes tun:
Die Collections- Klasse enthält eine Reihe dieser nützlichen, allgemeinen Tools.
quelle
JAVA 8 Lambda-Ausdruck
ODER
quelle
Collections.sort(studList, Comparator.comparing(Student::getFirstName));
studList.sort(Comparator.comparing(Student::getFirstName));
Mit Java 8 können Sie eine Methodenreferenz für Ihren Komparator verwenden:
quelle
Da Technologien jeden Tag erscheinen, wird sich die Antwort im Laufe der Zeit ändern. Ich habe mir LambdaJ angesehen und scheint sehr interessant zu sein.
Sie können versuchen, diese Aufgaben mit LambdaJ zu lösen . Sie finden es hier: http://code.google.com/p/lambdaj/
Hier haben Sie ein Beispiel:
Iterativ sortieren
Mit Lambda sortieren
Natürlich wirkt sich diese Art von Schönheit auf die Leistung aus (durchschnittlich zweimal), aber können Sie einen besser lesbaren Code finden?
quelle
quelle
Der beste einfache Weg mit JAVA 8 ist die englische alphabetische Sortierung
Klassenimplementierung
Sortieren
Wenn Sie nach einem Alphabet sortieren möchten, das nicht englische Zeichen enthält, können Sie das Gebietsschema verwenden ... Unterhalb des Codes verwenden Sie die türkische Zeichensortierung ...
Klassenimplementierung
Sortieren
quelle
Funktions- und Methodenreferenz
Die
Collections.sort
Methode kann eineList
mit einem vonComparator
Ihnen übergebenen sortieren . DiesComparator
kann mit derComparator.comparing
Methode implementiert werden , bei der Sie bei Bedarf eine Methodenreferenz übergeben könnenFunction
. Glücklicherweise ist der eigentliche Code viel einfacher und kürzer als diese Beschreibung.Für Java 8:
oder
Ein anderer Weg ist
quelle
Ab
Java 8
und zu müssen wir nicht mehrCollections.sort()
direkt verwenden.List
Schnittstelle hat eine Standardmethodesort()
:Siehe http://visvv.blogspot.in/2016/01/sorting-objects-in-java-8.html .
quelle
Java 8 Lambda verkürzt die Sortierung.
quelle
Collections.sort(stdList, Comparator.comparing(SomeClass::getName));
Mit dem Bean Comparator können Sie nach jeder Eigenschaft in Ihrer benutzerdefinierten Klasse sortieren.
quelle
Ja, das ist zum Beispiel in dieser Antwort möglich, die ich nach der Eigenschaft
v
der Klasse sortiereIndexValue
Wenn Sie hier bemerken, erstelle ich eine anonyme innere Klasse (Java für Closures) und übergebe sie direkt an die
sort
Methode der KlasseArrays
Ihr Objekt kann auch implementiert werden
Comparable
(das ist es, was String und die meisten Kernbibliotheken in Java tun), aber das würde die "natürliche Sortierreihenfolge" der Klasse selbst definieren und Sie können keine neuen einfügen.quelle
Comparator
:)Ich fand, dass die meisten, wenn nicht alle dieser Antworten auf der zugrunde liegenden Klasse (Objekt) beruhen, um eine vergleichbare oder eine helfervergleichbare Schnittstelle zu implementieren.
Nicht mit meiner Lösung! Mit dem folgenden Code können Sie das Feld des Objekts vergleichen, indem Sie dessen Zeichenfolgennamen kennen. Sie können es leicht ändern, um den Namen nicht zu verwenden, aber dann müssen Sie es verfügbar machen oder eines der Objekte erstellen, mit denen Sie vergleichen möchten.
quelle
Sie können versuchen, Guave zu bestellen :
quelle
Sie können mit Java 8 sortieren
quelle
Diese Codefragmente könnten nützlich sein. Wenn Sie in meinem Fall ein Objekt sortieren möchten, möchte ich nach VolumeName sortieren:
Das funktioniert. Ich benutze es in meinem jsp.
quelle
Mit dieser Bibliothek können Sie hier die Liste der benutzerdefinierten Objekte nach mehreren Spalten sortieren. Die Bibliothek verwendet Funktionen der Version 8.0. Dort gibt es auch ein Muster. Hier ist ein Beispiel zu tun
quelle
Sie können sich diese Präsentation auf dem Java-Forum in Stuttgart 2016 ansehen .
Nur wenige Folien verwenden die deutsche Sprache. 99% des Inhalts besteht aus "englischbasiertem" Java-Quellcode. mögen
wo
OurCustomComparator
werden Standardmethoden (und andere interessante Ideen) verwendet? Wie gezeigt, führt dies zu einem sehr präzisen Code, um eine Getter-Methode zum Sortieren auszuwählen. und supereinfaches Verketten (oder Umkehren) von Sortierkriterien.Wenn Sie sich für Java8 interessieren, finden Sie dort viel Material, um loszulegen.
quelle
Neu seit 1.8 ist eine List.sort () -Methode anstelle der Collection.sort (), sodass Sie mylistcontainer.sort () direkt aufrufen.
Hier ist ein Code-Snippet, das die Funktion List.sort () demonstriert:
Die Obstklasse ist:
quelle
Ihre customComparator-Klasse muss java.util.Comparator implementieren, um verwendet zu werden. es muss auch compare () AND equals () überschreiben
compare () muss die Frage beantworten: Ist Objekt 1 kleiner, gleich oder größer als Objekt 2?
Vollständige Dokumente: http://java.sun.com/j2se/1.5.0/docs/api/java/util/Comparator.html
quelle
Ich bevorzuge diesen Prozess:
Wenn Ihre Objektliste eine Eigenschaft mit dem Namen hat
startDate
, rufen Sie diese immer wieder auf. Sie können sie sogar verkettenstartDate.time
.Dies erfordert , dass Ihr Objekt zu sein ,
Comparable
das heißt , Sie brauchen einencompareTo
,equals
undhashCode
Implementierung.Ja, es könnte schneller sein ... Aber jetzt müssen Sie nicht für jede Art von Sortierung einen neuen Komparator erstellen. Wenn Sie Entwicklungszeit sparen und die Laufzeit aufgeben können, können Sie sich für diese entscheiden.
quelle
Mit Java 8 kann die Verwendung
Comparator
in einer Zeile mit definiert werdenComparator.comparing()
Verwenden Sie eine der folgenden Möglichkeiten:
Option 1:
Option 2:
quelle
Ihre benutzerdefinierte Klasse kann die Schnittstelle "Comparable" implementieren, für die die CompareTo-Methode implementiert werden muss. In der CompareTo-Methode können Sie dann definieren, was es bedeutet, dass ein Objekt kleiner oder größer als das andere Objekt ist. In Ihrem Beispiel kann es also ungefähr so aussehen:
..........
Eine negative Zahl zeigt an, dass dies kleiner ist als das Objekt, mit dem verglichen wird. Eine positive Zahl zeigt dies an größer als das im Vergleich zum Objekt ist, und eine Null bedeutet, dass die Objekte gleich sind.
Sie können dann die collection.sort (myList) verwenden, um Ihre Liste zu sortieren, ohne einen Komparator eingeben zu müssen. Diese Methode hat auch den Vorteil, dass Dinge automatisch sortiert werden, wenn Sie sortierte Sammlungsdatenstrukturen wie ein TreeSet oder eine TreeMap verwenden.
Sie können diesen Artikel lesen, wenn Sie mehr über die vergleichbare Oberfläche lesen möchten (Offenlegung: Ich bin der Autor;)) https://nullbeans.com/the-java-comparable-interface-automatic-sort-of-collections/
quelle
Sie können Springs PropertyComparator auch verwenden, wenn Sie nur einen String-Eigenschaftspfad zu der (verschachtelten) Eigenschaft haben, die Sie sortieren möchten:
Der Nachteil ist, dass dieser Komparator Eigenschaften, die nicht vorhanden oder nicht zugänglich sind, stillschweigend ignoriert und dies als Nullwert für den Vergleich behandelt. Dies bedeutet, dass Sie einen solchen Komparator sorgfältig testen oder die Existenz des Eigenschaftspfads irgendwie überprüfen sollten.
quelle
Mit der Java-8-Stream-API können Sie eine sortieren
ArrayList
nach:quelle
Ich habe viele verschiedene im Internet verfügbare Lösungen ausprobiert, aber die für mich geeignete Lösung finden Sie unter dem folgenden Link.
https://www.java67.com/2017/07/how-to-sort-arraylist-of-objects-using.html
quelle