Comparable und Comparator

H

HASSUN

Gast
Hallo zusammen,


Ich hab mich gerade bei euren Forum zum unterschied zwischen Comparable und Comparator eingelesen.
Da stand das falls sich für ein Objekt eine Natürliche Ordnung finden lässt, kann man das Interface jaa.lang.Comparable benutzen.
Dabei wird der Algorithmus in der Methode compareTo implimentiert um herauszufinden welches der Objekte größer ist.

Sollte sich keine Natürliche Ordnung finden, so wird der Comparator eingesetzt welcher die Methode compare benutzt. Diese vergleicht ebenso zwei Objekte welche größer ist. Comparator wird jedoch bei seltsame Vergleiche gemacht.


Meine Aufgabe die ich habe ist einmal den unterschied zwichen Comparable und Comparator zu definieren und Aufgabe (b)
Implimentiere einen Comparator, welcher Buch nach Titel und Autor sortiert.

Frage:
Meint man mit einer Natürlichen Ordnung z.B Helligkeit von Licht oder einen Geräusch eines Motors je nachdem welcher lauter ist oder die Stärke von Eisen.

Wie könnte dann für die Aufgabe (b) eine Ordnung finden lassen nach was sortiert werden soll??


LG
 
S

SlaterB

Gast
> Wie könnte dann für die Aufgabe (b) eine Ordnung finden lassen nach was sortiert werden soll??

die Ordnung steht doch in der Aufgabe, du sollst sie nur implementieren

---------

'natürliche' zu 'sonstige' Ordnung ist etwas übertrieben interpretiert,
aber es gilt nunmal, dass man das Comparable-Interface nur einmal implementieren kann und dann genau eine bestimmende Ordnung in der Klasse selber definiert,
die Standard-Sortierung, die bei jedem einfachen Collections.sort(liste) verwendet wird,
für Strings und Zahlen z.B. alphabetisch, aufsteigend usw., durchaus die 'natürliche Ordnung'

Comparator sind dagegen beliebige für den Einzelfall neu erstellte Objekte, mit denen man andere Ordnungen definieren kann,
z.B. erstmal nach Länge eines String, Quersumme der Buchstaben und dann noch Vokal vor Konsonant ;)
sowas komisches will man nicht in der Klasse stehen haben, das macht man getrennt in einem Comparator

es spricht aber technisch nichts dagegen das andersrum zu machen
oder ein Klase überhaupt nicht Comparable implementieren zu lassen sondern immer nur Comparatoren zu verwenden (wenn man sich nicht willkürlich irgendeinen Standard ausdenken will)
 
Zuletzt bearbeitet von einem Moderator:

Landei

Top Contributor
In meinem eigenen Code versuche ich Comparable zu vermeiden und nur mit Comparatoren zu arbeiten. Die Implementierung des Comparable-Interfaces verträgt sich z.B. schlecht mit Vererbung (wenn relevante Datenfelder hinzugefügt werden). Praktisch ist, häufig gebrauchte Comparatoren als statische Member anzubieten:

Java:
public class Bla {
   public final static Comparator<Bla> ORDERED_BY_FOO = new Comparator<Bla>() {
     //Implementation...
   };
   public final static Comparator<Bla> ORDERED_BY_BAR = new Comparator<Bla>() {
     //Implementation...
   };
   ...
}
 
H

HASSUN1

Gast
Dankeschön,


Ich hab mal versucht die Implementierung vorzunehmen, muss aber sagen das ich mich etwas schwer bei dem tue.

mein kleiner Anasatz:

Code:
// Klasse Buch
Class Buch {

String Titel;
String Autor;


Buch ( String Titel, String Autor ) {

this.Titel = Titel;
this.Autor = Autor;

}


public String getTitel(){ return Titel; }
public String getAutor(){ return Autor; }

}

// Nun muss dann der Comparator erstellt werden, der die Sortierung vor nimmt.


Jetzt müsste der Comparator erstellt werden, aber wie könnte der aussehen. Könnte mir jemand einen Ansatz zeigen wie's nun weiter geht.


LG
 
S

SlaterB

Gast
wie kannst du dich 'eingelesen' haben ohne irgendwelche Beispiele zu kennen,
das wirft man dir doch überall hinterher:
Google
 
H

HASSUN2

Gast
Ich denke mal ein Individuelles beispiel hilft mir mehr als die Beispiele aus google. Bei denen es meistens darum geht if ( a > b ) return 1 else if ( a < b ) return -1 else return 0

Bei mein Beispiel gehts aber nicht um Zahlen sondern um etwas anderes. Sortieren nach Titel und Autor. Wenn mir google sowas ausspucken würde, dann würd ich euch nicht fragen und um Hilfe bitten.

Außerdem brauch ich beim pogrammieren bei java etwas hilfe von selbs schaff ich das nicht.
Würd mich also freuen wenn jemand so nett ist und es mit mir schrittweise durchgeht.

LG
 
S

SlaterB

Gast
dieser Wunsch ist berechtigt,
von mir noch der Hinweis, dass z.B. schon der erste google-Link keine ints vergleicht, sondern Namen, echte Strings,
du müsstest praktisch nur noch getName() durch getTitle() ersetzen
 
H

HASSUN2

Gast
hmmm....
kannst du mir nun wirklich bei der realisation helfen oder nicht.

getTitel durch getName zu ersetzen ist nicht wirklich schwer. Und nun? Comparator Example For User Defined Class : CollectionApache CommonJava das sieht mir sehr kompliziert aus.

Code:
// Klasse Buch
Class Buch {

String Titel;
String Autor;


Buch ( String Titel, String Autor ) {

this.Titel = Titel;
this.Autor = Autor;

}


public String getTitel(){ return Titel; }
public String getAutor(){ return Autor; }

}
 

eRaaaa

Top Contributor
Naja, du kannst doch aber zu mindestens schon einmal den groben Aufbau gestalten oder nicht?
Java:
class BookComparator implements Comparator<Buch> {

    @Override
    public int compare(Buch o1, Buch o2) {
	//vergleiche titel
	//titel gleich ? dann vergleiche autor
    }
}

o1 und o2 sind die Bücher die du vergleichen willst..du kannst nun auf deren methoden getTitel, getAutor zugreifen. Die geben dir ja einen String zurück...diese Strings musst du nun vergleichen...(Tip: Strings haben eine natürliche Ordnung)!

(ich bin mir auch sicher dass hier im Forum sich das ein oder andere Beispiel zum Vergleich mit Strings finden lässt :D )
 
S

SlaterB

Gast
das wichtigste wäre z.B. schonmal, überhaupt eine Comparator-Klasse zu erstellen,
das kannst du auch von Landei's Posting oben kopieren, die generischen Klammern <Bla> müssen erstmal nicht sein,

das klingt simpel, aber nichtmal diesen Schritt übernimmst du, daher fällt mir nichts zur Hilfe ein,
ich könnte es entweder komplett für dich programmieren, was ich nicht will, oder weiter auf die überall sehr offensichtlichen Vorlagen hinweisen
 
H

HASSUN3

Gast
Also Ich würde mal sagen, es müsste so aussehen. Übrigens lassen sich Strings auch mit equals vergleichen aber dein Tipp bezog sich auf eine natürliche Ordnung deswegen habe ich compareTo verwendet.


Code:
public int comparator implements Comparator<Buch>

@Override
public int compare ( Buch eins, Buch zwei ) {

if ( ein.getTitel().compareTo(zwei.getTitel() ) && ein.getAutor().compareTo(zwei.getAutor() ) ) { return ... } 

}
 
S

SlaterB

Gast
bei compare gehts doch darum einen int-Rückgabewert zurückzugeben..
dazu fehlt noch alles, immer auf die Beispiele schauen,
ohne return macht eine compare-Methode selbst syntaktisch wenig Sinn,

----

in einem if gehört compare auch eher weniger, höchstens in der Form
Java:
if ( ein.getTitel().compareTo(zwei.getTitel()  == 0 )
==
WENN die Titel gleich sind DANN.. (dann vergleiche z.B. die Autoren, sonst reicht der Titel-Vergleich)
 
H

HASSUN4

Gast
okAy, so sollte es dann SInn ergeben:

Code:
public int comparator implements Comparator<Buch>

@Override
public int compare ( Buch eins, Buch zwei ) {


                int titel = ein.getTitel().compareTo(zwei.getTitel();
                int autor = ein.getAutor().compareTo(zwei.getAutor();
                
                if (titel != 0)
                {
                        return titel;
                }
                else (autor != 0)
                {
                        return autor;
                }

}
 
S

SlaterB

Gast
schon recht gut, fehlt noch der Feinschliff, den kann ich nun ja ergänzen

Java:
public class BuchComparator implements Comparator<Buch> {

     @Override
     public int compare ( Buch eins, Buch zwei ) {
                int titel = ein.getTitel().compareTo(zwei.getTitel();
                if (titel != 0)
                {
                        return titel;
                }
                return ein.getAutor().compareTo(zwei.getAutor();
    }
}
Klasse richtig definieren!

für autor == 0 muss auch etwas zurückgegeben werden


je nachdem ob aufsteigend oder absteigend sortiert werden soll, eins und zwei vertauschen,
auf jeden Fall testen, nicht so für richtig halten
 
H

HASSUN5

Gast
Ist dein Beispiel nicht das gleiche wie das hier:
also das man anstatt das: return ein.getAutor().compareTo(zwei.getAutor();
auch das ganze ausschreibt...

Code:
public class BuchComparator implements Comparator<Buch> {
 
     @Override
     public int compare ( Buch eins, Buch zwei ) {
                int titel = eins.getTitel().compareTo(zwei.getTitel();
                if (titel != 0)
                {
                        return titel;
                }


                int autor = ein.getAutor().compareTo(zwei.getAutor();
                if (autor != 0)
                {
                        return autor;
                } else if ( autor == 0 ){
                    return 0;
                }
		
    }
}
 
S

SlaterB

Gast
das dürfte das gleiche sein, ja, nur wäre die Variante mit dem if für autor unnötig länger und unschön

edit: ein Unterschied ist noch, dass die zweite Variante nicht kompiliert, da der Kompiler nicht für jede Situation einen Rückgabewert als gesichert sieht
 
Zuletzt bearbeitet von einem Moderator:
H

HASSUN6

Gast
Alles klar, also ist die Musterlösung bis hierin:

Code:
// Klasse Buch
Class Buch {

String Titel;
String Autor;


        Buch ( String Titel, String Autor ) {

         this.Titel = Titel;
         this.Autor = Autor;
        }

 
       public String getTitel(){ return Titel; }
       public String getAutor(){ return Autor; }




public class BuchComparator implements Comparator<Buch> {
 
     @Override
     public int compare ( Buch eins, Buch zwei ) {
                int titel = eins.getTitel().compareTo(zwei.getTitel();
                if (titel != 0)
                {
                        return titel;
                }


                int autor = ein.getAutor().compareTo(zwei.getAutor();
                if (autor != 0)
                {
                        return autor;
                } else if ( autor == 0 ){
                    return 0;
                }
		
    }
}

}


Kann ich das jetzt so auf meinen Karteikarten aufschreiben oder ist da noch was Falsch?



Ich danke allen beteiligten für ihre Hilfe!!
 
S

SlaterB

Gast
Ähnliche Java Themen
  Titel Forum Antworten Datum
N Comparable bzw 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
S Unterschied Comparable und Comparator Java Basics - Anfänger-Themen 2
S Comparator / Comparable ? Java Basics - Anfänger-Themen 3
D Frage zu Collection.sort bzw. Comparator u. Comparable Java Basics - Anfänger-Themen 2
B Wann Comparator und wann Comparable Java Basics - Anfänger-Themen 6
J HashSet mit Comparable sortieren Java Basics - Anfänger-Themen 13
J Interface Comparable<T> Java Basics - Anfänger-Themen 10
L Interface & Comparable Java Basics - Anfänger-Themen 15
I Generics und Comparable Java Basics - Anfänger-Themen 14
O Comparable Generic Java Basics - Anfänger-Themen 24
R Quicksort mit Interface Comparable Java Basics - Anfänger-Themen 6
Kornblume Comparable Interface für Objektvergleiche nutzen Java Basics - Anfänger-Themen 15
C Was macht `public class ClassName<T extends Comparable<T>>`? Java Basics - Anfänger-Themen 14
M Generische Liste aus Comparable-Objekten Java Basics - Anfänger-Themen 6
R Interface Eigene Objekte in Listen sortieren mit Interface Comparable Java Basics - Anfänger-Themen 5
K Comparable - Objekte aus Array vergleichen und größtes auswählen Java Basics - Anfänger-Themen 1
Shizmo Frage zu Comparable Java Basics - Anfänger-Themen 4
L LinkedList Comparable < > MEHRFACH implementieren? Java Basics - Anfänger-Themen 3
N Datentypen LocalDate Generic Comparable Java Basics - Anfänger-Themen 2
S Generics und Comparable Interface Java Basics - Anfänger-Themen 5
N Compiler-Fehler Comparable / compareTo implementierung Java Basics - Anfänger-Themen 2
F Comparable mit String Java Basics - Anfänger-Themen 5
F Objekte sortieren mit Comparable Java Basics - Anfänger-Themen 9
R Mehrere Interfaces(Comparable, ...) Java Basics - Anfänger-Themen 2
C Comparable Interface Java Basics - Anfänger-Themen 8
T Interface Interface Comparable Problem... Java Basics - Anfänger-Themen 2
H Interface Comparable Verständnisfrage Java Basics - Anfänger-Themen 6
B Object "Method" in TreeSet, Fehler beim Vergleichen/Comparable Java Basics - Anfänger-Themen 9
pg1337 Interface Comparable-Interface bei HashMap Java Basics - Anfänger-Themen 21
J Probleme mit Comparable, compareTo() Java Basics - Anfänger-Themen 2
A Comparable interface Java Basics - Anfänger-Themen 26
I Interface Comparable für Server-Item-Interface Java Basics - Anfänger-Themen 12
P Comparable und Generics Java Basics - Anfänger-Themen 6
S comparable und equals Java Basics - Anfänger-Themen 7
M Frage zum Interface Comparable Java Basics - Anfänger-Themen 3
S Comparable Java Basics - Anfänger-Themen 4
S instanceof Comparable...geht nicht? Java Basics - Anfänger-Themen 20
M comparable funktion & reverse funktion Java Basics - Anfänger-Themen 8
H Mehrere Comparable Java Basics - Anfänger-Themen 4
D Comparable - Bucketsort / Radixsort? Java Basics - Anfänger-Themen 2
B Mehrere Werte mit Comparable sortieren Java Basics - Anfänger-Themen 14
S String umwandeln in Comparable Java Basics - Anfänger-Themen 6
R Comparable Interface Funktionalität selbst programmieren? Java Basics - Anfänger-Themen 3
A Interface Comparable Java Basics - Anfänger-Themen 2
J Comparable Java Basics - Anfänger-Themen 9
frau-u Wie vergleicht Comparable Java Basics - Anfänger-Themen 2
M Comparable - Bedingung erzwingen Java Basics - Anfänger-Themen 3
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
J Comparator Java Basics - Anfänger-Themen 21
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
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
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
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
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
S JTable mit Comparator sortieren, die Frage ist wo? Java Basics - Anfänger-Themen 4
W Comparator Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben