So erstellen Sie diese java-Komparator
Habe ich diese Klasse:
public class Test {
private int priority;
private String desciption;
...
}
und ich habe diese arraylist:
Priority: 1, Description: C2
Priority: 2, Description: C1
Priority: 3, Description: C1
Priority: 4, Description: C2
Möchte ich dieses Ergebnis:
Priority: 1, Description: C2
Priority: 4, Description: C2
Priority: 2, Description: C1
Priority: 3, Description: C1
Wie ich haben, dies zu tun mit Komparator?
Danke!
EDIT:
Ich die Antwort auf all Ihre Fragen:
@retro: Nein. Beschreibung ist eine Zeichenfolge, die, ohne ein bestimmtes format. es kann leer sein, auch.
@tobias_k: erste "Gruppe" von Beschreibung und als Bestellung mit Priorität. Priorität ist nicht immer gleich.
@user270349:
dies ist mein Versuch:
int result = 0;
if (o1.getPriority() < o2.getPriority()) result = -1;
else if (o1.getPriority() > o2.getPriority()) result = 1
result *= o1.getDescription().compareTo(o2.getDescription());
return result;
EDIT 2:
anderen Eingabe - /Ausgabe-Beispiel:
und ich habe diese arraylist:
Priority: 1, Description: C2
Priority: 2, Description: C3
Priority: 3, Description: C1
Priority: 4, Description: C2
Möchte ich dieses Ergebnis:
Priority: 1, Description: C2
Priority: 4, Description: C2
Priority: 2, Description: C3
Priority: 3, Description: C1
DIES IST MEINE LÖSUNG:
List<Test> testList = new ArrayList<>();
testList.add(new Test(4, "C2"));
testList.add(new Test(2, "C3"));
testList.add(new Test(3, "C1"));
testList.add(new Test(1, "C2"));
Comparator<Test> comparator = new Comparator<Test>() {
@Override
public int compare(Test o1, Test o2) {
int res = o1.getDescription().compareTo(o2.getDescription());
if (res == 0)
return o1.getPriority() < o2.getPriority() ? -1 : 1;
else
return res;
}
};
Collections.sort(testList, comparator);
List<String> valoriInseriti = new ArrayList<>();
List<Test> grouping = new ArrayList<>();
for (Test t : testList) {
if (!valoriInseriti.contains(t.getDescription())) {
valoriInseriti.add(t.getDescription());
grouping.add(t);
}
}
comparator = new Comparator<Test>() {
@Override
public int compare(Test o1, Test o2) {
return o1.getPriority() < o2.getPriority() ? -1 : 1;
}
};
Collections.sort(grouping, comparator);
Collections.sort(testList, comparator);
List<Test> output = new ArrayList<>();
for (Test t1 : grouping) {
for (Test t2 : testList) {
if (t2.getDescription().equals(t1.getDescription())) {
output.add(t2);
}
}
}
System.out.println("==============================");
for (Test t : output)
System.out.println(t);
Tun die Beschreibungen haben immer das gleiche format? Immer einen char, eine Ziffer? Kann es noch andere chars, mehr stellen?
Beschreiben Sie bitte, wie Sie möchten, dass der Komparator arbeiten: in Erster Linie durch Beschreibung, absteigend, und Sekundär nach Priorität aufsteigend? Auch, was haben Sie versucht, und was ist das problem?
Was haben Sie versucht? Was verstehst du nicht über die Komparator-Schnittstelle in der javadoc? Was ist die Anforderung (in Englisch, nicht nur ein Beispiel). -1
siehe mein edit! danke!!!
Ich denke, dein code ist richtig, aber nicht mit den Anforderungen übereinstimmen. Ich glaube, IMHO, dass Sie nicht verstehen die Anforderungen. Vielleicht müssen Sie die Gruppe durch die Beschreibung und Sortieren Sie die Gruppen, indem Sie die höchste Priorität in der Gruppe und dann Sortieren innerhalb der Gruppe nach Priorität zu? Würde ich nicht tun, nur die Sortierung mit comparator. Ich würde darstellen, wie Objekte den Gruppen selbst.
Beschreiben Sie bitte, wie Sie möchten, dass der Komparator arbeiten: in Erster Linie durch Beschreibung, absteigend, und Sekundär nach Priorität aufsteigend? Auch, was haben Sie versucht, und was ist das problem?
Was haben Sie versucht? Was verstehst du nicht über die Komparator-Schnittstelle in der javadoc? Was ist die Anforderung (in Englisch, nicht nur ein Beispiel). -1
siehe mein edit! danke!!!
Ich denke, dein code ist richtig, aber nicht mit den Anforderungen übereinstimmen. Ich glaube, IMHO, dass Sie nicht verstehen die Anforderungen. Vielleicht müssen Sie die Gruppe durch die Beschreibung und Sortieren Sie die Gruppen, indem Sie die höchste Priorität in der Gruppe und dann Sortieren innerhalb der Gruppe nach Priorität zu? Würde ich nicht tun, nur die Sortierung mit comparator. Ich würde darstellen, wie Objekte den Gruppen selbst.
InformationsquelleAutor Fabio Mignogna | 2013-12-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Test implements Comparator
und überschreibencompare()
MethodeInformationsquelleAutor Ruchira Gayan Ranaweera
InformationsquelleAutor eolith
Als, Ihr problem gibt, die Sie wollen, um das Objekt der
Test
Klasse in absteigender Reihenfolge mit Bezug aufdescription
Feld, verwenden SieCollections.reverseOrder(comparator)
InformationsquelleAutor Sage
Erste, was Sie tun möchten ist, machen Sie Ihre
Test
Klasse implementierenComparator
.Dieser arbeiten wird, weil
String
vergleicht lexographically. Es wird versucht, eine Sortierung in aufsteigender Reihenfolge in Bezug auf den ersten Brief. Wenn der erste Buchstabe gleich ist, es wird auf den nächsten Wert. Durch die Umkehrung, die Sie speichern können, in absteigender Reihenfolge.Dann Sortieren Sie es, verwenden Sie
Collections.sort(myList);
. Und hier ist eine funktionierende ideone Beispiel: http://ideone.com/SdFGFgComparable
?Sollte es nicht eher umsetzen Nur wenn dieser Vergleich ist der logische Weg, um zu vergleichen, dann, ganz/sehr oft der erforderlich ist, um von Vergleich erforderlich ist, ist es in einer anderen Komponente, und es kann gut sein, unterschiedliche Sortierung.
Vereinbart, dass
Comparable
sollte nur verwendet werden, für die eine Natürliche Vergleich (wenn vorhanden), und jede "lustige" Vergleiche mitComparator
. Aber dann IMHO dieComparator
sollte eine eigene Klasse und nicht die Klasse des Objekts verglichen werden.Ich denke, in Bezug auf gutes design, und der Komparator sollte, ist eine ganz andere Klasse und nicht als anonymes Objekt, aber ich denke, dass für den Kontext der Frage, diese Antwort würde ausreichen.
InformationsquelleAutor christopher
Tun, wie diese
Ihre TestComparator
Ihre Sortierung
Ihre Ausgabe
dieses Beispiel mit Beispiel, aber wenn ich das input-Priorität: 1, Beschreibung: C2 Priorität: 2, Beschreibung: C3-Priority: 3, Beschreibung: C1 Priorität: 4, Beschreibung: C2 sollte die Ausgabe-Priorität: 1, Beschreibung: C2 Priorität: 4, Beschreibung: C2 Priorität: 2, Beschreibung: C3 und Ihr Beispiel funktioniert nicht. danke trotzdem!
Bitte aktualisieren Sie Ihre Frage mit der Eingangs-und erwartete Antwort.
fertig! ich update meine Frage! 🙂
InformationsquelleAutor Prabhakaran
Ich denke, Sie Sortieren soll (mit comparator), dann Gruppe, dann Sortieren Sie die Gruppen (mit einem anderen Komparator, können den ersten Komparator angewendet, um das erste element auf der Liste), dann degroup.
InformationsquelleAutor aalku