Strings sortieren: 2 Kritieren

Kababär

Top Contributor
Hi,

wie könnte ich denn eine Liste von Strings sortieren, die so aufgebaut sind:
1. Sommersemester oder Wintersemester (SS oder WS)
2. Das Jahr
bspw: WS 2015

Die Comparators habe ich
Code:
        Comparator<String> bysemester = (String o1, String o2) -> o1.substring(3).compareTo(o2.substring(3));
        Comparator<String> byname = (String o1, String o2) -> o1.substring(0, 2).compareTo(o2.substring(0, 2));
aber wie wende ich das jetzt zusammen an?
 
Ich glaub ich habs...
Code:
class MultiComparator implements Comparator<String> {

    @Override
    public int compare(String o1, String o2) {
        int result = o1.substring(3).compareTo(o2.substring(3));
        if (result == 0) {
            result = o1.substring(0, 2).compareTo(o2.substring(0, 2));
        }
        return result;
    }

}
 
Das ist OK so.

Alternativ:
Deinem ersten Beitrag entnehme ich, dass du Java 8 verwendest. Du kannst Comparatoren beliebig hintereinanderhängen. Das sieht dann so aus:
Java:
List<String> semesters = new ArrayList<>();
semesters.add("WS 2015");
semesters.add("WS 2017");
semesters.add("WS 2012");
semesters.add("SS 2015");
semesters.add("SS 2017");

semesters.sort(
    Comparator.<String,String>comparing(s -> s.substring(3)).thenComparing(s -> s)
);
System.out.println(semesters);

Ausgabe:
Code:
[WS 2012, SS 2015, WS 2015, SS 2017, WS 2017]

(Beim zweiten Vergleich musst du den Substring nicht mehr bilden, sondern kannst direkt die ursprünglichen Strings vergleichen)

Wenn du die zwei Comparatoren wie in deinem ersten Beitrag schon "irgendwo fertig herumfliegen hast", dann auch einfach so:
Java:
  Comparator<String> bysemester = (String o1, String o2) -> o1.substring(3).compareTo(o2.substring(3));
  Comparator<String> byname = (String o1, String o2) -> o1.substring(0, 2).compareTo(o2.substring(0, 2));

  semesters.sort(
      bysemester.thenComparing(byname)
  );

Und wenn wir schon dabei sind, statt des zweiten (wie zuvor erwähnt überflüssigen selbst definierten) Comparators ginge dann auch
Java:
....thenComparing(String::compareTo)
 
Zuletzt bearbeitet:
Nur so als Anmerkung: Der String Vergleich für die Jahreszahl ist nicht unbedingt das beste. In deinem Fall scheint es keinen Unterschied zu machen, da ja nur mit Zahlen von 2015 und aufwärts zu rechnen ist. Wenn da aber z.B. das WS 330 mit sortiert werden sollte 🙂 würde das als letztes in der Liste stehen obwohl es das erste in der Liste sein sollte.
 

Zurück
Oben