15.08.20 8526 Views 8

credit: ©jim/ stock.adobe

JAVA blog

Listen sortieren: Das Interface Comparable

Arrays zu sortieren ist eine häufige Notwendigkeit im Programmieralltag. Wenn es sich dabei um ein Array aus Referenztypen handelt, 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 statische Methode Arrays.sort() ausführen.

Das Zusammenspiel zwischen Comparable und Arrays.sort()

Arrays von primitiven Datentypen sowie von Strings sind problemlos durch die statische Methode Arrays.sort() in eine geordnete Reihenfolge zu bringen:

int[] zahlen = {4, 3, 1, 2};
Arrays.sort(zahlen);
System.out.println(Arrays.toString(zahlen)); // [1, 2, 3, 4]

String[] letters = {"B", "A", "D", "C"};
Arrays.sort(letters);
System.out.println(Arrays.toString(letters)); // [A, B, C, D]

Wichtig ist, dass wir die Klasse Arrays aus dem Paket java.util importieren (import java.util.Arrays;).

Bei Arrays von Referenztypen ist das aber nicht ganz so einfach. Damit die Sortierung hier funktioniert, muss die entsprechende Klasse zuerst das Interface Comparable mit der Methode compareTo() implementieren.

Erst nachdem die Methode compareTo() mit einem sinnvollen Sortierkrierium ausprogrammiert wurde, kann das Array mittels Arrays.sort() sortiert werden. So könnten wir etwa Roboter-Objekte nach einem von uns festgelegten Kriterium (z.B. verfügbare Energie) sortieren.

Das theoretische Prinzip des Zusammenspiels zwischen dem Interface Comparable und der Methode Arrays.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 Arrays.sort() wird diese vom Programm verwendet, um das Array 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 sinnvoll festgelegt. Sehen wir uns hierzu die compareTo()-Methode der Klasse Roboter einmal 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 Arrays.sort() werden alle Objekte des Arrays auf diese Weise miteinander verglichen und so in die entsprechende Reihenfolge gebracht. Dabei kommt der Quicksort-Algorithmus zum Einsatz.

Testen wir das nun:

Roboter[] liste = {
        new Roboter("R2D2", 40),
        new Roboter("C3PO", 30),
        new Roboter("Nummer 5", 10),
        new Roboter("Dotty Matrix", 20)
        };

Arrays.sort(liste);
System.out.println(Arrays.toString(liste));

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

[Roboter{name='Nummer 5', energie=10}, Roboter{name='Dotty Matrix', energie=20}, Roboter{name='C3PO', energie=30}, Roboter{name='R2D2', energie=40}] 

Alphabetisches Sortieren

Wollen wir die Objekte nach einem String alphabetisch sortieren, beruht das Sortierkriterium auf einer 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(o.toString());

}

Sortieren wir nun das Array und geben es mit System.out.println(Arrays.toString(liste)); auf der Konsole aus, dann sehen wir, dass die Sortierung in alphabetischer Reihenfolge funktioniert hat:

[Roboter{name='C3PO', energie=30}, Roboter{name='Dotty Matrix', energie=20}, Roboter{name='Nummer 5', energie=10}, Roboter{name='R2D2', energie=40}] 

Ordnung ist das halbe Leben 😉

Java lernen

text text

PHP Lernen

zur PHP

JavaScript lernen

move nove move

FALCONBYTE.NET

Handmade with 🖤️

© 2018-2023 Stefan E. Heller

Impressum | Datenschutz | Changelog

Falconbyte Youtube Falconbyte GitHub facebook programmieren lernen twitter programmieren lernen discord programmieren lernen