Spezielle frage zum Comparator

niklas._.kpl

Mitglied
Hallo, ich habe eine etwas speziellere frage zu "implements Comparator". Es funktioniert in meinem Programm zwar alles wie es soll, aber ich würde gerne die Funktion dahinter verstehen wie es funktioniert. Ich habe eine eigene Klasse namens Person erstellt, diese hat 2 Eigenschaften (String name und int Alter) nun habe ich noch 2 weitere Klassen für den Comparator erstellt, der eine Sortiert nach den Namen und der andere Sortiert nach dem Alter:
Java:
class SortiereAngestelltenNamen implements Comparator<Angestellter> {

    @Override
    public int compare(Angestellter o1, Angestellter o2) {

        return o1.getName().compareTo(o2.getName());
    }

}

class SortiereAngestelltenAlter implements Comparator<Angestellter> {

    public int compare(Angestellter o1, Angestellter o2) {

        if (o1.getAlter() > o2.getAlter()) {
            return 1;
        } else if (o1.getAlter() < o2.getAlter()) {
            return -1;
        } else {
            return 0;
        }
    }

}

Wenn ich jetzt eine ArrayList (gefüllt mit Personen Objekten) Sortieren möchte, mache ich das ja wie Folgt:
Code:
        Collections.sort(angestelltenListe, new SortiereAngestelltenAlter());

Um zu herauszufinden, wie die Funktionsweise ist, habe ich einfach mal in meiner Comparator Klasse das implements weggelassen, dann entsteht sofort ein Fehler aber warum? Eigentlich benötigen wir doch das Interface nur auf die eine Unimplementierte Methode zuzugreifen, danach benötigen wir doch das Interface eigentlich nicht mehr oder verstehe ich da etwas Falsch? Die Funktion sort( ) greift doch auf die von mir erstellte Klasse zu. Warum benötigt es dann noch das Interface, vom dem wir die Funktion aufrufen (Beim erstellen). Ich hoffe, meine Frage ist nicht zu verwirrend, will die Funktionsweise dahinter nur richtig verstehen.
 

KonradN

Super-Moderator
Mitarbeiter
Um zu herauszufinden, wie die Funktionsweise ist, habe ich einfach mal in meiner Comparator Klasse das implements weggelassen, dann entsteht sofort ein Fehler aber warum?
Der sort Aufruf will einen Comparator als Parameter. Wenn Du da etwas übergibst, das kein Comparator ist, dann gibt es einen Fehler.

Eigentlich benötigen wir doch das Interface nur auf die eine Unimplementierte Methode zuzugreifen, danach benötigen wir doch das Interface eigentlich nicht mehr oder verstehe ich da etwas Falsch? Die Funktion sort( ) greift doch auf die von mir erstellte Klasse zu. Warum benötigt es dann noch das Interface, vom dem wir die Funktion aufrufen (Beim erstellen). Ich hoffe, meine Frage ist nicht zu verwirrend, will die Funktionsweise dahinter nur richtig verstehen.
Das Interface benötigen wir auf jeden Fall, denn das ist ja der geforderte Parameter.
Worauf Du evtl. hinaus willst, ist der Fakt, dass es sich hier um ein funktionales Interface handelt. Damit kann dieses auch per Lambda Expression oder Methodenreferenz erfüllt werden.

Also wenn Du die Klassen etwas umänderst und die Methode statisch machst (gibt ja kein State oder so), dann würde es kein implements mehr geben und das Alles sähe es so aus (Mit etwas umbenannten Methoden):
Java:
class AngestelltenSortierungen {
    public static int compareByName(Angestellter o1, Angestellter o2) {
        return o1.getName().compareTo(o2.getName());
    }
}

Nutzung mit Lambda Expression: Collections.sort(angestelltenListe, (a1, a2) -> AngestelltenSortierungen.compareByName(a1,a2));
Nutzung mit Methodenreferenz: Collections.sort(angestelltenListe, AngestelltenSortierungen::compareByName);

Die Implementation eines funktionalen Interfaces ist also wirklich eher unüblich. Statt dessen nutzt man eine Methode mit der notwendigen Signatur (und beliebigem Namen) um diese dann zu nutzen.

So kannst Du dann z.B. eine Klasse mit vielen Sortierungen bereit stellen.

Und wenn wir die Implementierungen ansehen: Das ist auch so eher unüblich. Comparator hat comparing Methoden. Diese compareByName Implementation wäre also etwas wie Comparator.comparing(Angestellter::getName)

Damit wäre der resultierende Aufruf schlicht etwas wie:
Collections.sort(list, Comparator.comparing(Angestellter::getName));
oder
Collections.sort(list, Comparator.comparingInt(Angestellter::getAlter));
 

niklas._.kpl

Mitglied
Der sort Aufruf will einen Comparator als Parameter. Wenn Du da etwas übergibst, das kein Comparator ist, dann gibt es einen Fehler.


Das Interface benötigen wir auf jeden Fall, denn das ist ja der geforderte Parameter.
Worauf Du evtl. hinaus willst, ist der Fakt, dass es sich hier um ein funktionales Interface handelt. Damit kann dieses auch per Lambda Expression oder Methodenreferenz erfüllt werden.

Also wenn Du die Klassen etwas umänderst und die Methode statisch machst (gibt ja kein State oder so), dann würde es kein implements mehr geben und das Alles sähe es so aus (Mit etwas umbenannten Methoden):
Java:
class AngestelltenSortierungen {
    public static int compareByName(Angestellter o1, Angestellter o2) {
        return o1.getName().compareTo(o2.getName());
    }
}

Nutzung mit Lambda Expression: Collections.sort(angestelltenListe, (a1, a2) -> AngestelltenSortierungen.compareByName(a1,a2));
Nutzung mit Methodenreferenz: Collections.sort(angestelltenListe, AngestelltenSortierungen::compareByName);

Die Implementation eines funktionalen Interfaces ist also wirklich eher unüblich. Statt dessen nutzt man eine Methode mit der notwendigen Signatur (und beliebigem Namen) um diese dann zu nutzen.

So kannst Du dann z.B. eine Klasse mit vielen Sortierungen bereit stellen.

Und wenn wir die Implementierungen ansehen: Das ist auch so eher unüblich. Comparator hat comparing Methoden. Diese compareByName Implementation wäre also etwas wie Comparator.comparing(Angestellter::getName)

Damit wäre der resultierende Aufruf schlicht etwas wie:
Collections.sort(list, Comparator.comparing(Angestellter::getName));
oder
Collections.sort(list, Comparator.comparingInt(Angestellter::getAlter));
Danke für die Ausführliche Antwort, bin gerade erst am Anfang und habe noch keine Ahnung wie Lambda funktioniert das kommt in meinem Kurs erst etwas Später. Habe immer gedacht implements Interface heißt das die Klasse nur von dem Interface erbt und dann war es das aber das ist sohl Falsch gedacht?
 

KonradN

Super-Moderator
Mitarbeiter
Habe immer gedacht implements Interface heißt das die Klasse nur von dem Interface erbt und dann war es das aber das ist sohl Falsch gedacht?
Prinzipiell ist das so durchaus richtig. So Sprachen sind da sehr formell. Du kannst Dir das so vorstellen als wäre der Compiler einer Beamter, der etwas prüft. Dann reicht es nicht, dass ein Gerät z.B. eine Norm erfüllt. Es muss auch drauf stehen. Es reicht also nicht, dass die Klasse die Methoden hat, die das Interface vorgibt, sondern es muss auch klar dokumentiert sein (durch das implements ....).
 

niklas._.kpl

Mitglied
Danke erstmal für die vielen schnellen Antworten. Habe verstanden, weshalb es so sein muss, ich denke, wenn ich in meinem Java Kurs weiter zu Lambdas und funktionalen Interfaces komme, wird sich der Kreis noch mehr schließen. Euch einen schönen Tag.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
X Einfache Frage; wie soll ich die spezielle float var speichern? Java Basics - Anfänger-Themen 2
TimoN11 Java spezielle Suchprobleme - Aufgabe Java Basics - Anfänger-Themen 5
S spezielle Wörter aus Liste entfernen Java Basics - Anfänger-Themen 2
T Spezielle Aufgabe zu Schleifen Java Basics - Anfänger-Themen 3
J Spezielle Ausgabe Formatierung Java Basics - Anfänger-Themen 4
P Methoden Erklärung wie ich eine spezielle Methode richtig anwende Java Basics - Anfänger-Themen 9
J Spezielle Matrix ausgeben ! Java Basics - Anfänger-Themen 8
N Linie auf spezielle Area zeichnen Java Basics - Anfänger-Themen 9
C Spezielle Array-Abfrage Java Basics - Anfänger-Themen 11
U Spezielle if-Schleife erstellen Java Basics - Anfänger-Themen 6
L String darf nur spezielle Zeichen enthalten Java Basics - Anfänger-Themen 6
R Mega NewbieFragen + eine spezielle^^ Java Basics - Anfänger-Themen 2
L Spezielle Operation Java Basics - Anfänger-Themen 8
Zrebna Frage zu Test-Driven Development (TDD) Java Basics - Anfänger-Themen 3
I Frage Thymeleaf -> Fehler ignorieren und mit "" ersetzen? Java Basics - Anfänger-Themen 15
I Frage Thymeleaf -> Prefix / Suffix ändern? Java Basics - Anfänger-Themen 11
D Rekursions Probleme / frage Java Basics - Anfänger-Themen 4
T Frage zu Parse Java Basics - Anfänger-Themen 2
H Frage an die Profis Java Basics - Anfänger-Themen 4
J Eine konzeptionelle Frage zu OOP Java Basics - Anfänger-Themen 3
P Frage zu Rekursion und Backtracking Java Basics - Anfänger-Themen 2
H Frage zur Ausgabe Java Basics - Anfänger-Themen 4
H Frage zu arithmetischen Operationen Java Basics - Anfänger-Themen 20
F Kurze Frage zu replace() Java Basics - Anfänger-Themen 19
JavaSchmecktLecker Polymorphie Frage zur Methodenüberschreibung Java Basics - Anfänger-Themen 21
J Frage zu einem "Taschenrechner" code Java Basics - Anfänger-Themen 9
B Erste Schritte Frage zu Instanzierung und Referenzen Java Basics - Anfänger-Themen 8
DoubleM Runtime.getRuntime().exec Frage Java Basics - Anfänger-Themen 2
J Eine theoretische Frage zur Praxis - JPanel oder Canvas Java Basics - Anfänger-Themen 5
O Frage: Formaler Typbezeichner? Java Basics - Anfänger-Themen 3
I BlueJ Queue Frage für Klausur Java Basics - Anfänger-Themen 2
N Verständnis Frage zu Variablen Java Basics - Anfänger-Themen 3
L Frage zum Array Java Basics - Anfänger-Themen 1
A Frage zum UML Design Java Basics - Anfänger-Themen 1
I Hilfe bei Klausur Frage Java Basics - Anfänger-Themen 8
izoards Drucken Frage zu FAQ Beitrag Java Basics - Anfänger-Themen 2
J Frage zu meinem Code (OOP) Java Basics - Anfänger-Themen 4
sserio Split() -> Regex Frage. Java Basics - Anfänger-Themen 7
A OCA Study Guide: 2. Frage aus Kapitel 3 Java Basics - Anfänger-Themen 9
sserio Date Library Frage Java Basics - Anfänger-Themen 9
Max246Sch Frage zu Währungsrechner Code Java Basics - Anfänger-Themen 2
sserio Frage zu HashMaps Java Basics - Anfänger-Themen 20
sserio Frage zu Threading - Multithreading Java Basics - Anfänger-Themen 2
sserio Frage zu Lambda Ausdrücken Java Basics - Anfänger-Themen 7
sserio Frage zu BigInteger Java Basics - Anfänger-Themen 1
D Frage bzgl. Enum-Handhabung Java Basics - Anfänger-Themen 16
xxx12 Frage Java Basics - Anfänger-Themen 2
I Generelle Frage zu Mikroservices (Spring Boot?), Docker... Java Basics - Anfänger-Themen 7
R Frage zu Methoden (Rückgabewert u. ohne.) Java Basics - Anfänger-Themen 2
A Frage zur programmierung Java Basics - Anfänger-Themen 12
M Frage zur Methode split der Klasse String Java Basics - Anfänger-Themen 32
R Input/Output Frage zu Java IO Java Basics - Anfänger-Themen 6
M Frage zu printWriter Java Basics - Anfänger-Themen 5
C Frage zu OLSMultipleLinearRegression Java Basics - Anfänger-Themen 31
KogoroMori21 Frage zum Euklidischen Algorithmus Java Basics - Anfänger-Themen 11
S Verständnis-Frage zu einer HÜ? Java Basics - Anfänger-Themen 1
F Frage betreff Programm mit dem man C++-Code in JAVA-Code übersetzen lassen kann Java Basics - Anfänger-Themen 2
L Frage zur Ticket Maschine Java Basics - Anfänger-Themen 1
J Frage zu OOP-Klassendiagramm Java Basics - Anfänger-Themen 8
OSchriever Frage zu Compiler Java Basics - Anfänger-Themen 8
H Frage zu Throw Exception Java Basics - Anfänger-Themen 2
TimoN11 Frage zu Java-Vererbung (Cast) Java Basics - Anfänger-Themen 5
Bademeister007 Hallo Leute ich hab eine Frage zur ArrayList Java Basics - Anfänger-Themen 8
F Frage betreff Programmierbücher zu Lagerverwaltung als Konsolenprogramm Java Basics - Anfänger-Themen 3
dieter000 Kurze Frage kann mir ejmand kurz diesen Code erklären, bzw wie man die zeilen erklärt und so Java Basics - Anfänger-Themen 1
I String.split regex Frage Java Basics - Anfänger-Themen 2
N Best Practice Frage zum MVC-Pattern Java Basics - Anfänger-Themen 2
dieter000 Frage zu einem Beispiel... Java Basics - Anfänger-Themen 5
J Frage zum Loggen Java Basics - Anfänger-Themen 18
J Methoden Frage: Array-Werte in anderer Methode ändern Java Basics - Anfänger-Themen 4
Zrebna Frage zum "Referenzen-konzept" in Java Java Basics - Anfänger-Themen 8
JD_1998 Array-Position aus einer Methode in einer anderen ausgeben (Kurze Frage) Java Basics - Anfänger-Themen 2
marcooooo Frage zu bestimmten Beispiel Java Basics - Anfänger-Themen 31
NeoLexx equals()-Methode Verständnis Frage anhand Code Beispiel Java Basics - Anfänger-Themen 22
N Input/Output Eine Frage über system.out.println. Java Basics - Anfänger-Themen 10
B Erste Schritte Learning Coding (!) Frage an erfahrene Programmierer. Java Basics - Anfänger-Themen 23
M konzeptuelle Frage: In welcher Klasse definiert man am Besten Methoden, die die Kommunikation mit dem User regeln? Java Basics - Anfänger-Themen 8
B Frage zum Code verständnis im Resultat Java Basics - Anfänger-Themen 10
C Exception-Frage Java Basics - Anfänger-Themen 3
J Eine Frage zur Schreibweise == ? : Java Basics - Anfänger-Themen 3
S Frage des Designs Java Basics - Anfänger-Themen 1
JavaTalksToMe Extends/Implements Frage Java Basics - Anfänger-Themen 3
pkm Frage zu Servletfunktion Java Basics - Anfänger-Themen 0
B Frage zur Währungsumrechnung Java Basics - Anfänger-Themen 3
S Allgemeine Frage über Generics und Vererbungen Java Basics - Anfänger-Themen 5
Kirby.exe Frage zur Verwendung von Interfaces Java Basics - Anfänger-Themen 6
D Frage zu Strings einer Exception Java Basics - Anfänger-Themen 4
L Wie frage ich ab, ob in einem Array, Werte doppelt vorkommen? Java Basics - Anfänger-Themen 4
D Frage zur IDE IntelliJ IDEA Java Basics - Anfänger-Themen 6
H Frage zum 2d Array Java Basics - Anfänger-Themen 1
N Frage zum Newton-Fraktal Java Basics - Anfänger-Themen 1
H Frage zu interfaces Java Basics - Anfänger-Themen 1
J Frage dazu Variablen klassenübergreifend zu verändern Java Basics - Anfänger-Themen 22
I Frage zu SkipList Java Basics - Anfänger-Themen 4
G Frage zu JScrollPane Java Basics - Anfänger-Themen 12
Kirby.exe Allgemeine Frage Java Basics - Anfänger-Themen 3
W Frage zu anonymen Klassen Java Basics - Anfänger-Themen 4
J Kleine Frage zu OOP Java Basics - Anfänger-Themen 371
S Frage Klasse und Objekte Java Basics - Anfänger-Themen 2
F Frage zu Iteratoren Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben