Jetzt anmelden...

Login
Passwort
Registrieren

JAVA Blog

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.

Kommentare [0] 82 Views

Stefan 15.08.2020

Infos zum Artikel

Kategorie Java
Autor Stefan
Datum 15.08.2020

Thema in Kurzform

  • Erster Schritt: java.util.Arrays importieren.
  • Zweiter Schritt: Interface Comparable implementieren.
  • Dritter Schritt: Methode comareTo() sinnvoll überschreiben und das Sortierkriterium festlegen.
  • Vierter 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 😉

Falconbyte unterstützen

Kommentar schreiben

Nur angemeldete und aktivierte Benutzer können kommentieren.

Alle Kommentare

Es gibt bislang noch keine Kommentare zu diesem Thema.

Methoden in Java

Wie erstelle ich Methoden?

Objekte löschen

Wir wissen, wie wir Objekte erstellen können. Aber wie werden wir sie wieder los?

switch/ case Anweisung

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

FALCONBYTE.NET

Handmade with 🖤️

© 2018-2020 Stefan E. Heller

Impressum | Datenschutz

facebook programmieren lernen twitter programmieren lernen youtube programmieren lernen