Frage von Anonynonymous, 22

Frage zu Interface Comparable Java?

Hallo zusammen,

ich bin an mehreren Stellen mit dem Interface "Comparable" in Berührung gekommen und verstehe die Funktionen noch nicht ganz in Ihrer Gesamtheit.

Mein Wissensstand:

Das Erste, was ich über Interfaces gelernt habe, dass sie ähnlich wie abstrakte Klassen Methoden definieren, die konkrete Klassen zu implementieren haben, wenn sie denn das Interface implementieren.

Statische Variablen kann man dort auch definieren.

Der Größte Unterschied ist jedoch, dass man sie im Gegensatz zu abstrakten Klassen auch noch instanzieren kann.

Hier bin ich mir noch nicht ganz sicher: Wenn eine Klasse ein Interface implementiert, dann haben auch Instanzen dieser Klasse den Typ Interface

Nun zu den eigentlichen Fragen:

1.Ich bin in Bezug auf das Interface Comparable noch mit einer Sortiermethode in Verbindung gekommen - ich meine es war Collections.sort(Parameter, Comparator). Das sah bei Implementierung so aus:

Collections.sort(ListeX, new Comparator())

in diesem Fall hieß es "new myGradeComparator()", weil einfach die Klasse, die Comparable implementiert hatte so hieß.

Ich verstehe nicht ganz, was hinter diesem Comparator steckt und wollte um Erklärung bitten, warum man der Methode einfach ein leeres anonymes Objekt (ich glaube so heißt es doch) mit auf den Weg geben kann, um die Liste zu sortieren.

2.Das Beispiel, welches ich hierzu gesehen hatte liegt mir leider nicht mehr vor, deshalb hoffe ich, ihr erkennt meine Intention trotz möglicherweise vagen Aussagen.

In dem Beispiel wurde eine Map, ich glaube eine HashMap war es, implementiert.

Mit dieser Map sollten verschiedene Methoden ausgeführt werden.

Dies war aber nicht so ohne weiteres möglich; Es wurde eine Fehlermeldung ausgegeben, weil die Map eine Ordnung haben müsse.

Worauf ich hinaus will: Die Klasse, die mit dieser Map arbeitet muss dafür das Interface Comparable implementiert haben, welches wohl diese Ordnung irgendwie implementieren kann.

Ich weiß, das ist sehr vage beschrieben, das Beispiel liegt mir aber wie gesagt leider nicht mehr vor - ich hoffe, ihr könnt trotzdem etwas mit diesem Punkt anfangen. ___ Die von mir beschriebenen Probleme legen nahe, dass Interfaces anscheinend doch noch mehr Funktionen zu Verfügung stellen, als ich bisher angenommen hatte.

Wenn dem so ist, woran erkenne ich die weiteren Funktionen der einzelnen Interfaces, oder ist es wirklich nur das Interface Comparable, welches diese Funktionen bereit stellt?

Vielen Dank für die Hilfe.

Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von KnusperPudding, Community-Experte für Java, 12

Du kannst Interfaces genauso wie abstrakte Klassen instanziieren. Jedoch wirst du gezwungen die zu implementierenden Methoden zu implementieren:

abstract class Test1 {
     abstract void test();
}
interface Test2 {
    void test();
}
new Test1() {

@Override
void test() {
throw new UnsupportedOperationException("Not supported yet.");
}
}.test();

new Test2() {
@Override
public void test() {
throw new UnsupportedOperationException("Not supported yet.");
}
}.test();

Hier bin ich mir noch nicht ganz sicher: Wenn eine Klasse ein Interface implementiert, dann haben auch Instanzen dieser Klasse den Typ Interface

Richtig:

Sieht deine Klasse so aus:

class MyTestClass<T> implements Comparable<T>{...}

Kannst du die Instanz auch so schreiben:

Comparable<String> comparable = new MyTestClass<>();

Erstmal der Unterschied zwischen Comparator und Comparable:

Comparable benötigst du um eine Array zu Sortieren, wobei du Comparable direkt in deiner Klasse implementierst, dessen Typ deine Array ist.

Comparator verwendest du nicht in diesem Kontext, sondern gibst den Comparator bei Collections.sort() mit um die Sortierung zu bestimmen.

Aber jetzt zu deiner Haupt-Frage:

Ich verstehe nicht ganz, was hinter diesem Comparator steckt und wollte um Erklärung bitten, warum man der Methode einfach ein leeres anonymes Objekt (ich glaube so heißt es doch) mit auf den Weg geben kann, um die Liste zu sortieren.

Das Sortieren mit einem Comparator funktioniert so:

Es werden immer zwei Werte miteinander verglichen, und dann entschieden ob der neue Wert vor oder nach dem aktuellen Wert platziert werden soll.

Und exakt das macht das Interface: Es stellt diese Grundmethode bereit, mit der Entschieden werden kann, welcher Wert vor und Nach einem anderen Wert zu liegen hat.

Des weiteren hast du auch den Vorteil, du kannst den Typen deiner Klasse dank Generics  angeben, wodurch dir direkt der Elementtyp zur Verfügung steht:

Collections.sort(list, new Comparator<MyTestClass> {

     public int compare(MyTestClass o1, MyTestClass o2) {
       ....
     }
}

Beispielsweise deine Klasse "MyTestClass" hat ein Int-Attribut: Ranking. so kannst du deine Liste mit "MyTestClass" elementen nach dem Ranking Sortieren lassen. 

Hierbei gibt es 3 mögliche Return werte: -1, 0 und 1 für: Aufsteigend, identisch und absteigend.

eine mögliche Implementierung könnte so aussehen:

public int compare(MyTestClass o1, MyTestClass o2) {
if (o1.getRanking() == o2.getRanking() { return 0; } else if (o1.getRanking() > o2.getRanking() { return -1; } else { return 1; }
}

Würdest du nach anderen Kriterien Sortieren wollen, so hast du mit Comparator die gigantisch Freie Wahl.

Antwort
von androhecker, 9

Ein Interface liefert keine Methoden, es definiert sie nur. Wenn man ein Interface implementiert (ausgenommen abstrakte Klassen) müssen diese Methoden erstellt werden.

1. Die Klasse myGradeComparator (sollte eigentlich vorne groß sein) implementiert schon Comparator, das ist eine ganz normale Instanzierung, keine anonyme Klasse. Da die Klasse Comparator implementiert, müssen in ihr die Methoden compare und equals definiert werden.

2. Wie soll das aussehen, dass das Hashmap Methoden aufruft? Kannst du das mal etwas genauer erklären?

Es würde vielleicht helfen, wenn du dir die JavaDocs durchliest:
https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html
https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten