Jetzt anmelden...

Login
Passwort
Registrieren
15.08.20 266 Views Kommentare [0] 0 0

credit: ©jim/ stock.adobe

JAVA Tutorial #50

Listen sortieren: Das Interface Comparable

Listen zu sortieren ist eine häufige Notwendigkeit im Programmieralltag. Damit das klappt, muss vor der Sortierung das Interface Comparable implementiert werden. Wie das funktioniert, sehen wir uns jetzt genauer an.

Falconbyte unterstüzen

Betrieb und Pflege von Falconbyte brauchen viel Zeit und Geld. Um dir auch weiterhin hochwertigen Content anbieten zu können, kannst du uns sehr gerne mit einem kleinen "Trinkgeld" unterstützen.

Thema in Kurzform

  • Erster Schritt: Interface Comparable implementieren.
  • Zweiter Schritt: Methode compareTo() sinnvoll überschreiben und das Sortierkriterium festlegen.
  • Dritter Schritt: Die statischen Methode Collections.sort() aufrufen.

    Inhaltsverzeichnis

  1. Das Zusammenspiel zwischen Comparable und Collections.sort()
  2. Die compareTo()-Methode

Das Zusammenspiel zwischen Comparable und Collections.sort()

Damit du die einzelnen Elemente einer Sammlung (zum Beispiel ArrayList) sortieren kannst, muss in der entsprechenden Klasse zuerst das Interface Comparable implementiert werden.

Hierzu überschreibst du die Interface-Methode compareTo() und programmierst sie mit einem sinnvollen Sortierkrierium aus (gleich mehr dazu).

Ist das erledigt, kann die Sammlung mittels der statischen Methode Collections.sort() entsprechend des festgesetzten Sortierkriteriums sortiert werden. So könntest du etwa Roboter-Objekte nach einem von dir festgelegten Kriterium (z.B. verfügbare Energie) sortieren.

Das theoretische Prinzip des Zusammenspiels zwischen dem Interface Comparable und der Methode Collections.sort() sehen wir in folgender Grafik:

Java Array Objekte comparable compareTo

Die compareTo()-Methode

Nun gilt es, das Sortierkriterium der compareTo()-Methode zu implementieren. Beim Aufruf von Collections.sort() wird diese vom Programm verwendet, um die Sammlung zu sortieren.

Wie funktioniert das?

Die Methode compareTo() nimmt eine Referenz eines Vergleichsobjekts auf, das mit dem aktuellen Objekt verglichen wird. Wie die beiden Objekte miteinander verglichen werden, wird vom Programmierer (also dir) in der compareTo()-Methode sinnvoll festgelegt. Sehen wir uns hierzu die compareTo()-Methode in einer Beispiel-Klasse namens Roboter an (ab Zeile 16):

public class Roboter implements Comparable{

    private String name;
    private int energie;

    public Roboter(String name, int energie){
        this.name = name;
        this.energie = energie;
    }

    public int getEnergie() {
        return energie;
    }

    @Override
    public int compareTo(Object o) {

        Roboter other = (Roboter) o;

        if(this.getEnergie() > other.getEnergie()){
            return 1;
        }
        else if(this.getEnergie() < other.getEnergie()){
            return -1;
        }
        else{
            return 0;
        }
    }
}

Wie wir ab Zeile 20 sehen, wird das aktuelle Objekt (this) mit dem Parameter-Objekt (other) hinsichtlich des Werts der Instanzvariablen energie verglichen.

Die Methode liefert einen von drei möglichen Werten zurück, der für die Sortierung entscheidend ist:

  • Wert 1: Das Ausgangsobjekt ist größer als das Vergleichsobjekt.
  • Wert -1: Das Ausgangsobjekt ist kleiner als das Vergleichsobjekt.
  • Wert 0: Beide Objekte sind gleich groß.

Beim Aufruf von Collections.sort() werden alle Objekte der Sammlung auf diese Weise miteinander verglichen und so in die entsprechende Reihenfolge gebracht. Dabei kommt der Quicksort-Algorithmus zum Einsatz.

Testen wir das nun:

    public static void main(String args[]){

        ArrayList<Roboter> liste = new ArrayList<>();
        liste.add(new Roboter("R2D2", 300));
        liste.add(new Roboter("C3PO", 400));
        liste.add(new Roboter("Baymax", 200));

        Collections.sort(liste); // Liste sortieren!

        for(Roboter sV : liste){
            System.out.println(sV);
        }

    }

Die Roboter werden nun aufsteigend nach dem Wert Ihrer Instanzvariablen energie sortiert:

Baymax 200
R2D2 300
C3PO 400

Alphabetisches Sortieren

Wollen wir die Objekte nach einem String alphabetisch sortieren, beruht das Sortierkriterium auf der sinnvoll überschriebenen toString()-Methode in der Klasse Roboter. Zum Beispiel:

@Override
public String toString() {
    return "Roboter{" + "name='" + name + '\'' + ", energie=" + energie + '}';
}

Die compareTo()-Methode kann nun deutlich schmaler ausfallen:

@Override
public int compareTo(Object o) {

    Roboter other = (Roboter) o;

    return toString().compareTo(other.toString());

}

Nach dem Aufruf der Collections.sort()-Methode hat die Sortierung in alphabetischer Reihenfolge funktioniert. Ein Konsolen-Ouput gibt folgendes Ergebnis:

Roboter{name='Baymax', energie=200}
Roboter{name='C3PO', energie=400}
Roboter{name='R2D2', energie=300}

Ordnung ist das halbe Leben 😉

Falconbyte unterstützen

Kommentar schreiben

Alle Kommentare

Es gibt bislang noch keine Kommentare zu diesem Thema.

Operatoren einsetzen

Es gibt eine Vielzahl an Operatoren. Wir haben eine Übersicht erstellt

Initializer

Eher selten aber praktisch!

switch/ case Anweisung

Benötigen wir eine Unterscheidung nach vielen Fällen empfehlen sich switch-case-Statements.

FALCONBYTE.NET

Handmade with 🖤️

© 2018-2021 Stefan E. Heller

Impressum | Datenschutz

Falconbyte GitHub facebook programmieren lernen twitter programmieren lernen discord programmieren lernen