Comparator

Hallo,
ich habe versucht mich in das Thema einzulesen (Literatur & Internet) jedoch komme ich kein Stück voran:
Wie kann man die comparable Methode implementieren, sodass diese zwei Objekte Miteinander vergleicht?
 

mafu

Mitglied
Code:
public static boolean comperable( Object o,Object c)
    {
        if(o.equals(c))
        {
            return true;
        }
        else
        {
            return false;
        }
       
    }
 

mrBrown

Super-Moderator
Mitarbeiter
Was verstehst du denn daran nicht?

Wie du das implementierst hängt von den Objekten ab, du musst schon selbst wissen, wie man die vergleichen kann ;)

Wichtig ist nur, das die Rückgabewerte den geforderten entsprechen - also -1,0,1, je nachdem was größer ist.


Ich möcht ja nicht meckern, aber das ist kompletter Unsinn
 

mrBrown

Super-Moderator
Mitarbeiter
Einmal hat das absolut nichts mit der Frage zu tun, in der es um Comparator geht, und andererseits ist der Stil echt schlecht.
Das if-else würde man schreiben als return o.equals(c), und damit wäre die Methode im wesentlichen, eine vorhandene Methode in eine statische auszulagern und unsinnig zu benennen, die hat genau gar keinen Vorteil gegenüber o.equals(c), außer zusätzlichen Imports und schlechterer Lesbarkeit.
 
Code:
public class Person {
   
    int alter;
    String name;
   
    public Person(int alter, String name){
        this.alter = alter;
        this.name = name;
       
    }

}

Wie würde man hier beispielsweise vorgehen, wenn man die Person nach alter sortieren möchte?
 

mrBrown

Super-Moderator
Mitarbeiter
Wie würde man hier beispielsweise vorgehen, wenn man die Person nach alter sortieren möchte?
Dir geht es um das Comparator-Interface?

Die zu implementierende Methode hätte die Signatur compare(Person p1, Person p2) und müsste -1 zurückgeben, wenn p1 jünger als p2 ist, 0 wenn sie gleich alt sind und 1, wenn p1 älter als p2 ist?

Bringt dich das schon weiter?
 
Dir geht es um das Comparator-Interface?

Die zu implementierende Methode hätte die Signatur compare(Person p1, Person p2) und müsste -1 zurückgeben, wenn p1 jünger als p2 ist, 0 wenn sie gleich alt sind und 1, wenn p1 älter als p2 ist?

Bringt dich das schon weiter?
public int compare(Person p1, Person p2){

if(p1.alter > p2.alter) return -1;
if (p1.alter == p2.alter ) return 0;
if (p1.alter < p2.alter) return 1;

}+

ich krieg noch die fehlermeldung "must return int"

ist mein gedankengang richtig? also mit meiner implementierung?
 

JStein52

Top Contributor
Du kannst dir die ganzen Abfragen auch sparen und schreiben:
Code:
 return p1.alter - p2.alter;
 

mrBrown

Super-Moderator
Mitarbeiter
Du kannst dir die ganzen Abfragen auch sparen und schreiben:
Code:
 return p1.alter - p2.alter;
Fürs Lernen sind die schöner ;)

Und wenn schon, sollte man Integer.compare nutzen, was wenig überraschend mit Vergleichen und nicht Subtraktion umgesetzt ist.

dann wirft er in der 3. zeile den fehler "unreachable code"
Gewöhn dir an, das if mit Klammern zu schreiben.
Zeig mal deinen jetzigen Code und welche du da als dritte Zeile siehst, sonst ist das nur raten
 

Neumi5694

Top Contributor
dann wirft er in der 3. zeile den fehler "unreachable code"
Klar, nach der ersten Bedingung lieferst du ja einen Rückgabewert. Der Rest wird niemals ausgeführt. Der "Else" Fall kommt zum Schluss. Einen der 3 Fälle musst du nicht prüfen. Die Zahl ist entweder größer oder sie ist gleich ODER (else-Fall) sie ist kleiner (Reihenfolge wurscht). Wenn sie also weder größer noch kleiner ist, dann musst du nicht mehr prüfen, ob sie kleiner ist. Anstatt der 3. Bedingung musst du einfach den Rückgabewert derselben liefern.
Hier 3 Möglichkeiten zum anständigen Coden (alle zulässig, stehen auch im originalen Java-Quellcode so drin)
Die 4. Methode zeigt dir, wie du weitermachst, wenn du mehr als nur das Alter vergleichen willst.
Java:
    /**
     * relativ "saubere" Variante, allerdings werden mehrere 'return' verwendet, das sollten Anfänger nicht machen. V2 ist für Anfänger besser
     */
    public int compareV1(Person p1, Person p2) {
        if (p1.alter > p2.alter) {
            return -1;
        } else if (p1.alter < p2.alter) {
            return 1;
        } else {
            //Auf Gleichheit musst du nicht mehr prüfen
            return 0;
        }
    }
    /**
     * "sauberste" Variante, so wie man es lernen sollte.
     */
    public int compareV2(Person p1, Person p2) {
        //Beachte: returnvalue wird hier am Anfang nicht initialisiert, der Compiler warnt dich also, wenn du es auswerten willst, so lange noch kein Wert gesetzt ist.
        int returnvalue;
        if (p1.alter > p2.alter) {
            returnvalue = -1;
        } else if (p1.alter < p2.alter) {
            returnvalue = 1;
        } else {
            //Auf Gleichheit musst du nicht mehr prüfen
            returnvalue = 0;
        }
        //Erst an diesem Punkt hat returnvalue garantiert einen Wert und darf weiterverwendet werden.
        return returnvalue;
    }
    /**
     * Diese Variante hat weniger Else-Bereiche, ist als etwas resourcenschonender, liefert aber auch immer direkt das Ergebnis. Für Anfänger nicht geeignet.
     */
    public int compareV3(Person p1, Person p2) {
        if (p1.alter > p2.alter) {
            return -1;
        }
        if (p1.alter < p2.alter) {
            return 1;
        }
        //Auf Gleichheit musst du nicht mehr prüfen
        return 0;
    }

    /**
     * Für mehrere Vergleiche
     *
     * @param p1
     * @param p2
     * @return
     */
    public int compareV4(Person p1, Person p2) {
        //Kürzen wir das Ganze etwas ab, für Integer gibt es bereits eine Compare-Funktion, schau dir deren Quellcode mal an
        int returnvalue = Integer.compare(p1.alter, p2.alter);
        //Alter verschieden, Ergebnis liefern
        if (returnvalue != 0) {
            return returnvalue;
        }
        //Alter gleich, es muss weiter verglichen werden
        returnvalue = compareTwoStrings(p1.name, p2.name);
        //Keine weiteren Vergleichsoptionen vorhanden, also einfach den Wert liefern. Ansonsten hier returnValue wieder auf 0 prüfen und den nächsten Parameter prüfen
        return returnvalue;
    }

    /**
     * String-Vergleich ohne Nullpointer-Exception
     * @param s1 String1
     * @param s2 String2
     * @return Beide Werte null: 0, s1 == null: 1, s2 == null: -1
     */
    private int compareTwoStrings(String s1, String s2) {
        if (s1 == null) {
            //Wenn beide Namen auf null gesetzt sind, dann als "gleich" betrachten, also Ergebnis 0
            //Nur p1.name == null ? 1
            return s2 == null ? 0 : 1;
        }
        if (s2 == null) {
            //nur p2.name == null? -1
            return -1;
        }
        //ansonsten echt vergleichen lassen
        return s1.compareTo(s2);
    }
Man kann natürlich nach Belieben kombinieren, das sind nur 3 Beispiele. Aber fange an, deinen Code wie in V2 zu schreiben, das ist die ordentlichste Methode.

ps: Schreib Wrapper für deine Instanzvariablen (public String getName(){...} und public void setName(String value){...}). Direkter Zugriff == nixGut;
Also nicht "p1.name" verwenden, sondern "p1.getName()", "name" selbst gehört auf private gesetzt.
 

Flown

Administrator
Mitarbeiter
/**
* relativ "saubere" Variante, allerdings werden mehrere 'return' verwendet, das sollten Anfänger nicht machen. V2 ist für Anfänger besser
*/
Warum? Compiler warnt dich auch hier, dass ein Pfad nichts returned V2 ist äquivalent zu V1
Bei V4 gibt es schon was wie Comparator::nullsFirst oder Comparator::nullsLast. Aber es sollte meiner Meinung nach da richtig krachen, denn welche Person hat denn keinen Namen?
 

Neumi5694

Top Contributor
Warum? Compiler warnt dich auch hier, dass ein Pfad nichts returned V2 ist äquivalent zu V1
Bei V4 gibt es schon was wie Comparator::nullsFirst oder Comparator::nullsLast. Aber es sollte meiner Meinung nach da richtig krachen, denn welche Person hat denn keinen Namen?
Warum ... zum besseren Verständnis. Returns mitten in einer Methode sind mitunter eine recht unübersichtliche Art zu Arbeiten. Ein Anfänger sollte sich auf ein Return pro Methode beschränken und den Workflow verstehen, bevor er so was macht. Der Thread-Ersteller muss sich erst noch mit if-then-else beschäftigen und damit, was bei einem return passiert, sonst würde er diese Fragen nicht stellen (siehe "unreachable code").
Zu V4 ... cool, wusste ich gar nicht, danke.
Wenn wir davon ausgehen, dass jedes Personenobjekt einen gültigen Namen haben MUSS, dann sollte setName(null) eine entsprechende Exception werfen und nicht erst der Comparator.
 

Flown

Administrator
Mitarbeiter
Wenn wir davon ausgehen, dass jedes Personenobjekt einen gültigen Namen haben MUSS, dann sollte setName(null) eine entsprechende Exception werfen und nicht erst der Comparator.
Klar. Valider Zustand ist Sache der einzelnen Klassen. Aber in dem Fall sind null-aware Comparatoren etwas übertrieben.
Warum ... zum besseren Verständnis. Returns mitten in einer Methode sind mitunter eine recht unübersichtliche Art zu Arbeiten. Ein Anfänger sollte sich auf ein Return pro Methode beschränken und den Workflow verstehen, bevor er so was macht. Der Thread-Ersteller muss sich erst noch mit if-then-else beschäftigen und damit, was bei einem return passiert, sonst würde er diese Fragen nicht stellen (siehe "unreachable code").
Das seh ich aber genau umgekehrt. Frühes Verlassen einer Methode hat den Vorteil zu wissen, dass weiter nachfolgender Code nicht mehr ausgeführt wird und muss nicht sicherstellen (meist verbunden mit weiteren/redundanten if-Abfragen) das dieser nicht ausgeführt wird.
 

Neumi5694

Top Contributor
Klar. Valider Zustand ist Sache der einzelnen Klassen. Aber in dem Fall sind null-aware Comparatoren etwas übertrieben.
Es gibt hier nur eben KEINE Validierung bisher, also einfach nur eine Exception beim Sortieren.

Das seh ich aber genau umgekehrt. Frühes Verlassen einer Methode hat den Vorteil zu wissen, dass weiter nachfolgender Code nicht mehr ausgeführt wird und muss nicht sicherstellen (meist verbunden mit weiteren/redundanten if-Abfragen) das dieser nicht ausgeführt wird.
Ich stimmer dir zu, dass das ein Vorteil ist (ich arbeite vor allem bei Vergleichsmthoden ja auch so), aber zum Lernen ist es besser, wenn man übt, die komplette Logik im Auge zu behalten. Gerade bei längeren Methoden sucht man sich sonst einen ab, alle returns zu finden.
Im Idealfall schreibt man sich gerade als Anfänger die Logik einer Methode erst mal als Struktogramm (oder in einem ähnlichen Hilfsmittel) auf, bevor man zu coden beginnt.
Ist halt Ansichtssache :)
 

JStein52

Top Contributor
Lustig, ihr arbeitet euch hier an einem Thema ab das bestimmt schon lange behoben ist. Ich tippe mal der TE hat längst :):):)auf Subtraktion umgestellt, alles funktioniert und er traut sich jetzt nicht das hier zu posten
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
N Spezielle frage zum Comparator Java Basics - Anfänger-Themen 6
M Comparator Java Basics - Anfänger-Themen 25
M Comparator Java Basics - Anfänger-Themen 4
berserkerdq2 Wie lege ich ein Attribut comparator an? Java Basics - Anfänger-Themen 13
W Personen sortieren mit Comparator Java Basics - Anfänger-Themen 9
H Comparator Fehlermeldung Java Basics - Anfänger-Themen 5
V Collections ArrayList mit Comparator sortieren Java Basics - Anfänger-Themen 16
B Collections Objektreferenz-ID in der Ausgabe (Comparator Interface) Java Basics - Anfänger-Themen 2
R Methode zwei Sortierkriterien der Klasse Comparator übergeben Java Basics - Anfänger-Themen 4
O Lambda Ausdrücke in einem Comparator Java Basics - Anfänger-Themen 4
A Priority Queue / Comparator Java Basics - Anfänger-Themen 6
I Comparator<T> Interface als Methodenparamter Java Basics - Anfänger-Themen 4
L Binäre Suche mit Comparator Java Basics - Anfänger-Themen 5
N Comparable bzw Comparator Java Basics - Anfänger-Themen 5
A Comparator Java Basics - Anfänger-Themen 4
G Interface java.util.Comparator: Wieso muss nur die Methode compare() implementiert werden Java Basics - Anfänger-Themen 2
V Comparator Java Basics - Anfänger-Themen 16
S Integer/Value-Paar in Prio-Queue ohne Comparator Java Basics - Anfänger-Themen 5
M Comparable und Comparator nicht ganz klar Java Basics - Anfänger-Themen 1
B Comparable & Comparator Java Basics - Anfänger-Themen 9
C Comparator und private Variablen Java Basics - Anfänger-Themen 7
S Comparator für Generiks Java Basics - Anfänger-Themen 6
Helgon Interface Comparator wird nicht instanziert Java Basics - Anfänger-Themen 3
C Comparator mit Double Werten? Java Basics - Anfänger-Themen 12
S Unterschied Comparable und Comparator Java Basics - Anfänger-Themen 2
E Comparator sortiert falsch... Java Basics - Anfänger-Themen 2
M Comparator Java Basics - Anfänger-Themen 7
B OOP Logikhilfe zum Comparator 2 Java Basics - Anfänger-Themen 12
B OOP Logikhilfe zum Comparator Java Basics - Anfänger-Themen 11
G Comparator Problem Java Basics - Anfänger-Themen 5
X eigener Mergesort auf generischen Typen mit Comparator Java Basics - Anfänger-Themen 6
H Comparable und Comparator Java Basics - Anfänger-Themen 22
Z Comparator Verständnisfrage Java Basics - Anfänger-Themen 5
B OOP Comparator - Sortierung "optisch" Darstellen Java Basics - Anfänger-Themen 17
A JTable sortieren mit einem Comparator Java Basics - Anfänger-Themen 2
S Comparator / Comparable ? Java Basics - Anfänger-Themen 3
G Objekte mit dem Attribut title mit Comparator sortieren Java Basics - Anfänger-Themen 5
P unchecked conversion to conform to Comparator Java Basics - Anfänger-Themen 3
G Comparator- methode compare exception werfen Java Basics - Anfänger-Themen 4
B interface Comparator Java Basics - Anfänger-Themen 4
M Hilfe bei der Erstellung der Comparator Klasse Java Basics - Anfänger-Themen 10
M ArrayList sortieren mittels Comparator Java Basics - Anfänger-Themen 10
G Sortieren ohne Comparator? Java Basics - Anfänger-Themen 4
G Comparator Java Basics - Anfänger-Themen 10
S Frage zu Comparator Java Basics - Anfänger-Themen 3
G ArrayList und Comparator Java Basics - Anfänger-Themen 6
M Comparator - Sortierkriterium Java Basics - Anfänger-Themen 11
L Comparator Java Basics - Anfänger-Themen 5
T Problem mit Comparator! Java Basics - Anfänger-Themen 7
C Anstatt Spalte, Zeile mit Comparator sortieren . Java Basics - Anfänger-Themen 5
B Liste sortieren mit Comparator Java Basics - Anfänger-Themen 2
D Frage zu Collection.sort bzw. Comparator u. Comparable Java Basics - Anfänger-Themen 2
S JTable mit Comparator sortieren, die Frage ist wo? Java Basics - Anfänger-Themen 4
B Wann Comparator und wann Comparable Java Basics - Anfänger-Themen 6
W Comparator Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben