Strings sortieren: 2 Kritieren

Dieses Thema Strings sortieren: 2 Kritieren im Forum "Allgemeine Java-Themen" wurde erstellt von Kababär, 13. Dez. 2016.

Thema: Strings sortieren: 2 Kritieren Hi, wie könnte ich denn eine Liste von Strings sortieren, die so aufgebaut sind: 1. Sommersemester oder...

  1. 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 (Text):
            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?
     
  2. Vielleicht hilft dir das Java-Tutorial weiter. Hier klicken --> (Klick)
  3. Ich glaub ich habs...
    Code (Text):
    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;
        }

    }
     
  4. stg
    stg
    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:
    Code (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 (Text):

    [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:
    Code (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
    Code (Java):

    ....thenComparing(String::compareTo)
     
     
    Zuletzt bearbeitet: 14. Dez. 2016
  5. 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.
     
  6. stg
    stg
    Das Problem haben wir ja erst wieder in knapp 8000 Jahren :D
     
  7. Danke :) die vielfältige Macht von Java 8 ist doch schon gigantisch.
     
  8. Schau dir jetzt hier den Kurs an und lernen Java zu programmieren: --> Hier klicken, um mehr zu erfahren (Klick)