Mit Vergleichbar für mehrere dynamische Felder von VO in java
Habe ich eine Klasse
public class StudentVO {
int age;
String name;
}
Ich die gleiche Klasse in zwei unterschiedliche Bereiche. An einer Stelle, die ich brauche zu Sortieren, basierend auf dem Alter. In einem anderen Ort, ich brauche zu Sortieren, basierend auf dem Namen und in
ein weiterer Ort, den ich brauchen kann Sortieren, basierend auf Alter und name. Wie kann ich dies tun?
Wenn ein Feld, das ich außer Kraft setzen können compareTo()
.
Ist es möglich, dies zu tun?
InformationsquelleAutor samba | 2013-04-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
1)schreiben Sie zwei Komparator für die Sortierung nach dem Alter und name getrennt, und verwenden Sie dann die Sammlungen.sort(List,Comparator). So etwas wie dieses:
Und verwenden Sie Sie dann Zu Sortieren, basierend auf
age
:Sortieren basierend auf
name
:2) Wenn Sie denken, dass die
List
vonStudentVO
hat einige Natürliche Reihenfolge der Sortierung, sagen wir angenommen, Sortieren nachage
. Verwenden Sie dann Vergleichbar fürage
undComparator
fürname
.Und verwenden Sie Sie dann Zu Sortieren, basierend auf
age
:Sortieren basierend auf
name
:Ich habe nicht genau das bekommen, was du meinst mit dem dynamic-Attribut, dennoch können Sie überprüfen, ob 'CompareToBuilder" Klasse von apache commons helfen ?
InformationsquelleAutor NINCOMPOOP
Gibt es einen neuen Ansatz für diese in
java-8
siehe Komparator#Vergleichund Komparator#thenComparing. Alles, was Sie brauchen, ist ein lamda-Ausdruck/Methode Referenz entweder zu
Stream#sorted()
oderList#sort()
Methode.Beispielsweise die Sortierung nach einem Feld:
Sortieren von ein paar Felder:
InformationsquelleAutor Anton Balaniuc
Hier ist der Codeausschnitt:
Entsprechend Ihrer Frage, es wird auch funktionieren, wenn die Werte der angegebenen Feld ändern. Sie müssen nur daran zu erinnern, zu nennen
sort
- Methode mit diesem Komparator.InformationsquelleAutor Kamil Chaber
In java, du hast zwei main-Methoden zum vergleichen von Objekten.
Die erste ist für die Klasse selbst zu implementieren, die Vergleichbar - Schnittstelle, was bedeutet, dass nur ein Implementierungen.
Die zweite ist um Klassen implementiert Komparator - Schnittstelle. Auf diese Weise können Sie mehrere Komparatoren für die gleiche Klasse.
Das bedeutet, dass Sie definieren könnte, zum Beispiel 3 diffenrent Komparatoren auf Ihre StudentVo Klasse : eine, die vergleichen nur auf den Namen, ein anderes, das vergleichen der Zeiten und der Letzte, der beide Eigenschaften.
In Ihrer Anwendung verwenden Sie die Umsetzung, die Farbe, die Sie benötigen, basierend auf dem, was Sie vergleichen möchten. In einem Ort, vergleichen Sie Studenten auf das Alter der Sammlungen.Sortieren(myStudents , neue CompareStudentOnAge()). In einem anderen Ort, verwenden Sie eine andere Implementierung.
Finden Sie einige Erklärungen in diesem blog-post : http://javarevisited.blogspot.fr/2011/06/comparator-and-comparable-in-java.html
InformationsquelleAutor Quentin Proust
Ich hatte vor kurzem dieses problem zu lösen, auch. Nicht sicher, ob dies ist genau das gleiche Szenario wie bei Ihnen, aber ich hatte zu schreiben, eine in-memory-sort für null oder mehr Spalten eines Gitters, handwaving über OOM Bedingungen, etc, denn mein problem war sehr begrenzt.
Schrieb ich einen Komparator für jede Spalte und ein Komparator, nahm eine Liste von Komparatoren. Als ich identifiziert, die die benötigten Spalten sortiert werden und in welcher Reihenfolge, ich fügte hinzu, eine Instanz der entsprechenden Komparator, um die Liste der Komparatoren. Verwenden Sie dann die verkettete Komparator zum ausführen der tatsächlichen Art.
Also, so etwas wie dies für jeden Komparator:
Diese für die verkettete Komparator:
Links, um Ihre Phantasie in der Analyse der Arten und der Aufbau der verketteten Komparator. Habe ich eigentlich gemacht, ein bisschen mehr kompliziert, weil ich auch eingebaut eine Richtung, die ich umgesetzt durch das vertauschen der Reihenfolge der Parameter im Aufruf der sub-Komparator in die verkettete Komparator, wie gebraucht.
InformationsquelleAutor colin