Comparable Interface für Objektvergleiche nutzen

Kornblume

Mitglied
Hallo zusammen,

ich bin neu in Sachen Java, also bitte verzeiht mir, falls ich in der Beschreibung meines Problems Fehler mache :)
Ich würde gerne eine ArrayList mit Objekten, die jeweils zwei Attribute haben, über einen Algorithmus sortieren lassen. Da in den Attributen auch Buchstaben vorkommen, sie also gewissermaßen einen String darstellen, habe ich etwas im Internet geschaut und bin auf das Comparable Interface mit der Methode "compareTo()" gestoßen.
Jetzt ist mir noch nicht ganz klar, wie ich das dann in der Praxis benutzen kann.
Füge ich das "...implements Comparable" in der Klasse meines Objekts ein, oder in der Klasse, in der ich meine Methode schreibe ?
Wie benutze ich "compareTo" am Besten, wenn ich das Attribut spezifizieren möchte, nachdem es die Objekte ordnet ?

Ich hoffe ihr konntet mich einigermaßen verstehen!

Vielen Dank für alle Antworten :)
 

looparda

Top Contributor
Es gibt sehr viele Möglichkeiten eine Sortierung zu erreichen. Ich persönlich implementiere nicht mehr Comparable<T> auf meine Datenklasse, da man sich mit dem Interface auf eine bestimmte Sortierung festlegt.
Ich mache es lieber so, dass ich einen Methode habe, die mir einen Comparator zurückgibt. Das kann eine innere Klasse sein oder in einer extra Datei liegen oder nur als Lambda-Ausdruck.
Hier am Beispiel mit Koordinaten, welches du durch Anpassen der compare und den Typen für dein String-Problem umschreiben kannst.
Java:
    /**
     * Comparator to compare by distance.
     */
    class DistanceToOrder implements Comparator<Coordinate2D> {
        @Override
        public int compare(Coordinate2D e1, Coordinate2D e2) {
            int dist1 = distanceSquaredTo(e1);
            int dist2 = distanceSquaredTo(e2);
            return Integer.compare(dist1, dist2);
        }
    }
    /**
     * Compares two points by distance.
     *
     * @return the comparator
     */
    public Comparator<Coordinate2D> distanceToOrderLambda() {
        return (o1, o2) -> {
            int dist1 = distanceSquaredTo(o1);
            int dist2 = distanceSquaredTo(o2);
            return Integer.compare(dist1, dist2);
        };
    }
    /**
     * Compares two points by distance.
     *
     * @return the comparator
     */
    public Comparator<Coordinate2D> distanceToOrder() {
        return new DistanceToOrder();
    }
Und sortieren kannst du dann mit Collectios.sort
Java:
static <T> void sort(List<T> list, Comparator<? super T> c)
Und sonst gibt es ettliche Tutorials dazu. Eins davon zeigt beide Ansätze mit Comparable und Comparator.
 

Flown

Administrator
Mitarbeiter
Ich persönlich implementiere nicht mehr Comparable<T> auf meine Datenklasse, da man sich mit dem Interface auf eine bestimmte Sortierung festlegt.
Comparable ist ein Interface für die natürliche Ordnung. D.h. da gibt es keinen Interpretationsspielraum, wie zum Beispiel bei den natürlichen Zahlen. Das ist fix vordefiniert.

Man kann beides Implementieren, wenn es eine natürliche Ordnung gibt Comparable und wenn man eine spezielle Sortierung haben möchte, dann Comparator.
 

looparda

Top Contributor
Ich meinte, dass man sich auf eine Ordnung anhand bestimmter Attribute festlegt aber oft je nach Ansicht nach verschiedenen Aspekten sortieren möchte. So kann man Personen nach Alter oder Namen sortieren - mach das mal mit der Implementierung von Comparable.
 

mrBrown

Super-Moderator
Mitarbeiter
Ich meinte, dass man sich auf eine Ordnung anhand bestimmter Attribute festlegt aber oft je nach Ansicht nach verschiedenen Aspekten sortieren möchte. So kann man Personen nach Alter oder Namen sortieren - mach das mal mit der Implementierung von Comparable.
Das ist auch eben nicht der Sinn von Compareable - Personen haben keine natürliche Ordung, also implementiert man sie auch nicht ;)
 

Kornblume

Mitglied
Ich meinte, dass man sich auf eine Ordnung anhand bestimmter Attribute festlegt aber oft je nach Ansicht nach verschiedenen Aspekten sortieren möchte. So kann man Personen nach Alter oder Namen sortieren - mach das mal mit der Implementierung von Comparable.


etwas ähnliches bräuchte ich.
Ist es möglich zwei Versionen von compareTo zu implementieren, die den Sortierfokus jeweils auf ein anderes Attribut legen ?
 

looparda

Top Contributor
Ist es möglich zwei Versionen von compareTo zu implementieren, die den Sortierfokus jeweils auf ein anderes Attribut legen ?
Genau das ist der Fokus meines Ansatzes ein Comparator zu liefern. Du kannst pro Sortierung/Ansicht einen separaten Comparator anlegen.
Wann man Comparable und wann Comparator einsetzt war mir nur anhand dieses Vorteils bekannt. Dass es auf die natürliche Ordnung zurückzuführen ist war mich dabei nicht bewusst.
 

Kornblume

Mitglied
Dafür nutzt man Comparator ;)

Achso, auch wenn man nur das Attribut ändern möchte ? Bsp. bei der Modellierung eines Menschen auf "Alter", "Größe", "Name", etc. ?
Ich habe das bei euch bislang so verstanden, dass man Comparator benutzt, wenn man die Sortierreihenfolge ändern möchte, also so etwas wie die Sortierregeln.
Da Buchstaben und Zahlen ja eine solche haben (bei Buchstaben dann anhand des ASCII Codes, oder?), bräuchte ich das ja nicht
 

Kornblume

Mitglied
Das ist doch das passende Stichwort: andere Attribute nach denen Sortiert wird = andere Sortierregeln ;)

Ok, dann glaube ich, dass ich das jetzt verstanden habe ;-)
Danke!

Wie sieht es dann mit der Anwendung von compareTo aus ?
Funktioniert das dann nur mittels Collections.sort oder kann ich die neue Regel auch innerhalb von einem selbst implementierten Sortieralgorithmus verwenden? Ich meine hierbei dann so etwas wie Quicksort, Heapsort, Mergesort.

Denn das wäre ja meine Anforderung in diesem Fall
 

mrBrown

Super-Moderator
Mitarbeiter
Wie sieht es dann mit der Anwendung von compareTo aus ?
Funktioniert das dann nur mittels Collections.sort oder kann ich die neue Regel auch innerhalb von einem selbst implementierten Sortieralgorithmus verwenden? Ich meine hierbei dann so etwas wie Quicksort, Heapsort, Mergesort.

Denn das wäre ja meine Anforderung in diesem Fall
Natürlich kannst du die auch in deinem eigenen Algorithmus verwenden, es ist ja nur eine Methode, die was zurück gibt. Wer die aufruft, ist egal
 

Neumi5694

Top Contributor
compareTo ist überall dort sinnvoll, wo vordefiniert ist, was rauskommen soll, wenn sich ein Objekt mit einem zweiten vergleichen soll. Die Methode selbst sortiert nicht. Sie liefert lediglich die Information, ob die andere Variable weiter hinten oder weiter vorne in der Liste stehen soll, der verwendete Sortieralgorithmus macht den Rest.

Wenn du verschiedene Sortierkriterien willst, ist ein Comparator tatsächlich die richtige Herangehensweise.
Z.B. kannst du im Konstruktor übergeben, nach welchen Kriterien sortiert werden soll. In der compare-Methode folgst du dann den Anweisungen.
Hier ein einfaches Beispiel
Java:
    /**
     * Komparator f&uuml;r Punkte
     */
    public class SortPointsXY implements Comparator<Point2D.Double> {

        private final boolean xFirst;

        /**
         * Comparator für Punkte
         *
         * @param xFirst: true: Zuerst nach X sortieren.
         * <br>false: Zuerst nach Y sortieren
         */
        public SortPointsXY(boolean xFirst) {
            this.xFirst = xFirst;
        }

        @Override
        public int compare(Point2D.Double p1, Point2D.Double p2) {
            int result;
            if (xFirst) {
                result = Double.compare(p1.getX(), p2.getX());
                if (result == 0) {
                    result = Double.compare(p1.getY(), p2.getY());
                }
            } else {
                result = Double.compare(p1.getY(), p2.getY());
                if (result == 0) {
                    //Hier mal ein Beispiel mit compareTo. p1.getX() vergleicht sich mit p2.getX()
                    //Der erste Cast ist notwendig,
                    //weil "double" eine primitiver Datentyp ist und die Methode somit gar nicht hat.
                    //an der zweiten Stelle muss man dank Javas Autoboxing nicht casten.
                    result = ((Double) p1.getX()).compareTo(p2.getX());
                }
            }
            return result;
        }
    }

Es gibt gewisse Vorgaben für die Compare-Methode (bzw. compareTo), aber über die stolperst du noch früh genug.
Wenn du mit funktionaler Programmierung arbeitest, muss die Compare-Methode die Informationen, wie sie sortieren soll, natürlich von einer andereren Stelle kriegen. Nur selten ist die compareTo-Methode geeignet, wenn es mehr als eine Eigenschaft zum Vergleichen gibt.
 

mrBrown

Super-Moderator
Mitarbeiter
Wenn du verschiedene Sortierkriterien willst, ist ein Comparator tatsächlich die richtige Herangehensweise.
Z.B. kannst du im Konstruktor übergeben, nach welchen Kriterien sortiert werden soll. In der compare-Methode folgst du dann den Anweisungen.
In dem Fall eigenen ich eher getrennte Comparatoren für die unterschiedlichen Kriterien (oder einfach Comparator-Chaining)

Wenn du mit funktionaler Programmierung arbeitest, muss die Compare-Methode die Informationen, wie sie sortieren soll, natürlich von einer andereren Stelle kriegen.
Was ändert daran funktionale Programmierung? o_O
 

Neumi5694

Top Contributor
In dem Fall eigenen ich eher getrennte Comparatoren für die unterschiedlichen Kriterien (oder einfach Comparator-Chaining)
Auch ok, das war ja nur ein Beispiel.
Was ändert daran funktionale Programmierung? o_O
Ich hab den Parameter über den Konstruktor reingeschickt. Mit Lambda oder einem Funktionsverweis geht das nicht, bzw. mir wäre nichts dergleichen bekannt.
Chaining könnte wohl effizienter sein, auf jeden Fall ist damit das Risiko von Tippfehlern geringer :)
Es handelt sich hier wirklich nur um ein Beispiel, nicht die ultimative Lösung aller Probleme.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Interface Comparable für Server-Item-Interface Java Basics - Anfänger-Themen 12
J Interface Comparable<T> Java Basics - Anfänger-Themen 10
L Interface & Comparable Java Basics - Anfänger-Themen 15
R Quicksort mit Interface Comparable Java Basics - Anfänger-Themen 6
R Interface Eigene Objekte in Listen sortieren mit Interface Comparable Java Basics - Anfänger-Themen 5
S Generics und Comparable Interface Java Basics - Anfänger-Themen 5
C Comparable Interface Java Basics - Anfänger-Themen 8
T Interface Interface Comparable Problem... Java Basics - Anfänger-Themen 2
pg1337 Interface Comparable-Interface bei HashMap Java Basics - Anfänger-Themen 21
A Comparable interface Java Basics - Anfänger-Themen 26
M Frage zum Interface Comparable Java Basics - Anfänger-Themen 3
R Comparable Interface Funktionalität selbst programmieren? Java Basics - Anfänger-Themen 3
A Interface Comparable Java Basics - Anfänger-Themen 2
J HashSet mit Comparable sortieren Java Basics - Anfänger-Themen 13
I Generics und Comparable Java Basics - Anfänger-Themen 14
O Comparable Generic Java Basics - Anfänger-Themen 24
C Was macht `public class ClassName<T extends Comparable<T>>`? Java Basics - Anfänger-Themen 14
N Comparable bzw Comparator Java Basics - Anfänger-Themen 5
M Generische Liste aus Comparable-Objekten Java Basics - Anfänger-Themen 6
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
N Compiler-Fehler Comparable / compareTo implementierung Java Basics - Anfänger-Themen 2
F Comparable mit String Java Basics - Anfänger-Themen 5
M Comparable und Comparator nicht ganz klar Java Basics - Anfänger-Themen 1
F Objekte sortieren mit Comparable Java Basics - Anfänger-Themen 9
R Mehrere Interfaces(Comparable, ...) Java Basics - Anfänger-Themen 2
B Comparable & Comparator Java Basics - Anfänger-Themen 9
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
J Probleme mit Comparable, compareTo() Java Basics - Anfänger-Themen 2
P Comparable und Generics Java Basics - Anfänger-Themen 6
S comparable und equals Java Basics - Anfänger-Themen 7
S Unterschied Comparable und Comparator Java Basics - Anfänger-Themen 2
S Comparable Java Basics - Anfänger-Themen 4
H Comparable und Comparator Java Basics - Anfänger-Themen 22
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
S Comparator / Comparable ? Java Basics - Anfänger-Themen 3
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
J Comparable Java Basics - Anfänger-Themen 9
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
frau-u Wie vergleicht Comparable Java Basics - Anfänger-Themen 2
M Comparable - Bedingung erzwingen Java Basics - Anfänger-Themen 3
I No Jakarta Enterprise Beans found with interface ignorieren? Java Basics - Anfänger-Themen 2
I No EJB found with interface of type Java Basics - Anfänger-Themen 12
wolei Java generic interface in a generic class Java Basics - Anfänger-Themen 6
Say Abstrakt oder Interface Java Basics - Anfänger-Themen 3
Say public/default Interface Java Basics - Anfänger-Themen 9
D Interface Methode wird ungewollt in der Subklasse überschrieben Java Basics - Anfänger-Themen 5
W Intuitive interface für Komponenten Java Basics - Anfänger-Themen 4
I Browser integriert in Desktop Applikation - Webcam interface not found Java Basics - Anfänger-Themen 26
U Beispiel Methode size() vom "Collection"-interface... Wie kann man sichtbar machen, was die Methode unter der Haube macht? Java Basics - Anfänger-Themen 8
M Interface oder Vererbung? Java Basics - Anfänger-Themen 12
D Interface Verständisfrage Java Basics - Anfänger-Themen 8
U Interface | constructor injection Java Basics - Anfänger-Themen 5
J Interface Interface korrekt implementieren Java Basics - Anfänger-Themen 5
A Methoden Vererbung und Interface Java Basics - Anfänger-Themen 14
T Interface Map und Map.Entry Java Basics - Anfänger-Themen 4
U Interface als PAramter (Vergleich) und ein Error Java Basics - Anfänger-Themen 9
I Interface von einer EJB Klasse, um Code zu reduzieren Java Basics - Anfänger-Themen 1
M Interface als Parameter einer Klasse Java Basics - Anfänger-Themen 8
M Wie kann ich eine Methode aus einem Interface in eine Klasse implementieren, so dass sie ihre Funktion ausführt? Java Basics - Anfänger-Themen 7
I JSON und Interface Java Basics - Anfänger-Themen 3
Kotelettklopfer Kleines Testprogramm mit Interface und einer Usereingabe Java Basics - Anfänger-Themen 16
J Interface methode aufrufen (interface parameter) Java Basics - Anfänger-Themen 7
CptK Interface Functional interface mit mehreren Methoden Java Basics - Anfänger-Themen 6
T Interface Java Basics - Anfänger-Themen 0
CptK Generics: Klassen die Interface implementieren, aber selbst nicht das Interface sind Java Basics - Anfänger-Themen 8
B Interface List - Objekt übergeben? Einzelnes Objekt geht, aber Liste nicht? Java Basics - Anfänger-Themen 4
B Best Practice Unschlüssig ob Vererbung oder Interface Java Basics - Anfänger-Themen 2
E abstrakte Klasse implementiert ein Interface Java Basics - Anfänger-Themen 40
C Interface und Konstruktor Java Basics - Anfänger-Themen 1
S Interface Equals und hashCode Java Basics - Anfänger-Themen 16
A Generische Klassen/Interface Java Basics - Anfänger-Themen 1
C Methoden-Parameter ist Interface Java Basics - Anfänger-Themen 5
B Collections Objektreferenz-ID in der Ausgabe (Comparator Interface) Java Basics - Anfänger-Themen 2
A Interface Kuddelmuddel Java Basics - Anfänger-Themen 4
C Collections List über Interface zugreifen Java Basics - Anfänger-Themen 32
S Interface Interface und seine Implementierung Java Basics - Anfänger-Themen 5
H abstract und interface Java Basics - Anfänger-Themen 4
F Interface Casting Java Basics - Anfänger-Themen 13
C Telefonliste mit interface implementieren Java Basics - Anfänger-Themen 30
L Klassen Kann eine Unterklasse einer abstrakten Klasse ein Interface implementieren? Java Basics - Anfänger-Themen 2
H Interface Java Basics - Anfänger-Themen 2
T Interface Methode im Interface mit mehreren Parametern Java Basics - Anfänger-Themen 10
B Interface vs Abstract Java Basics - Anfänger-Themen 2
B Objekte zählen/ Vererbung/ Kopplung/ Interface/ Abstract Class Java Basics - Anfänger-Themen 5
pkm Interface Funktionales Interface lässt sich nicht implementieren. Java Basics - Anfänger-Themen 2
I Comparator<T> Interface als Methodenparamter Java Basics - Anfänger-Themen 4
J OOP Wie sollte ich das organisieren (Abstract? Interface?) Java Basics - Anfänger-Themen 33
J Java Interface/abstrakte Klassen Java Basics - Anfänger-Themen 2
E Interface nur von abstrakter Klasse implementierbar?! Java Basics - Anfänger-Themen 1
J Vererbung Abstrake Klasse <-> Interface Java Basics - Anfänger-Themen 5
C Interface als Datentyp eines Attributes? Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben