Wichtigkeit des Comparators

erdochef

Mitglied
Hallo,
ich habe eine Frage.

Warum nutzen generische Sortieralgorithmen wie Mergesort, Quicksort oder Shellsort das Comparator-Interface? Warum ist das Comparator-Interface für solche Algorithmen unverzichtbar?

Kann mir das jemand erklären?
Danke im Vorraus.
 

Tobse

Top Contributor
Das Problem ist folgendes: Nehmen wir mal an, du benutzt einen QuickSort um Strings Alphabetisch absteigend zu sortieren. Folgender Code entsteht:

Java:
public static List<String> sortStringsLexicographicallyDescending(List<String> list) {
    if (list.size() < 2) {
        return list;
    }
    List<String> less = new ArrayList<String>();
    List<String> greater = new ArrayList<String>();

    String pivot = list.get(0);
    for (int i = 1;i < list.size();i++) {
        if (pivot.compareTo(list.get(i)) < 1) {
            greater.add(list.get(i));
        } else {
            less.add(list.get(i));
        }
    }

    return sortStringsLexicographicallyDescending(less).add(pivot).addAll(sortStringsLexicographicallyDescending(greater));
}

Was ist jetzt, wenn du die Strings aber auchnoch alphabetisch aufsteigend sortieren musst? Oder case sensitive/insesitive? Oder wenn du keine Strings mehr sortierst sondern Zahlen?
Wenn du für jeden dieser Anwendungsfälle das QuickSort neu schreibst, hast du nachher 20 fast identische Versionen des selben Codes vorliegen; das wiederspricht dem OOP-Prinzip der Wiederverwendung.
Ausserdem: der QuickSort aus meinem Code-Beispiel ist performance-technisch suboptimal und enthält möglicherweise Fehler (ist ungetestet). Wenn du jetzt 20 QuickSorts für unterschiedliche Datentypen schreibst und dann einen Fehler im Alogrithmus findest (oder dessen Performance erhöhst), musst du 20 Stellen im Code ändern. Das ist nicht nur Zeitaufwendig sondern auch sehr Fehleranfällig.

Mit dem Comparator / Comparable-Interface kannst du den Sortieralgorithmus ein mal schreiben. Der Code des Algorithmus kümmert sich dann auch nur um das Sortieren, nicht um das einstufen/bewerten/vergleichen von zwei Elementen (OOP-Prinzip der strikten Aufgabentrennung).
 

Neue Themen


Oben