Ich habe Klassen gesehen, die sowohl Comparable als auch Comparator implementieren . Was bedeutet das? Warum sollte ich eins über das andere verwenden?
java
comparator
comparable
Nick Heiner
quelle
quelle
Antworten:
Der folgende Text stammt von Comparator vs Comparable
Vergleichbar
Ein vergleichbares Objekt kann sich mit einem anderen Objekt vergleichen. Die Klasse selbst muss die
java.lang.Comparable
Schnittstelle implementieren , um ihre Instanzen vergleichen zu können.Komparator
Ein Komparatorobjekt kann zwei verschiedene Objekte vergleichen. Die Klasse vergleicht nicht ihre Instanzen, sondern die Instanzen einiger anderer Klassen. Diese Komparatorklasse muss die
java.util.Comparator
Schnittstelle implementieren .quelle
Implementieren
Comparable
bedeutet " Ich kann mich mit einem anderen Objekt vergleichen ". Dies ist normalerweise nützlich, wenn es einen einzelnen natürlichen Standardvergleich gibt.Implementieren
Comparator
bedeutet " Ich kann zwei andere Objekte vergleichen ". Dies ist normalerweise nützlich, wenn es mehrere Möglichkeiten gibt, zwei Instanzen eines Typs zu vergleichen - z. B. können Sie Personen nach Alter, Name usw. vergleichen.quelle
Person
Implementieren tunComparable
, da Sie dann nicht ändern können, wie zwei Personen verglichen werden.Person
. 2) Der Komparator, der beispielsweisePersonAgeComparator
zwei verschiedene Entitäten vergleichen und entscheiden kann, welche in dieser bestimmten Sortierreihenfolge an erster Stelle stehen sollen. 3) Der Sortiercode, der eine Sammlung von Entitäten und einen Komparator verwendet und diese Sammlung mithilfe des Komparators sortiert, um die Reihenfolge zu bestimmen.Mit Comparable kann eine Klasse ihren eigenen Vergleich implementieren:
Im Vergleich dazu ist Comparator ein externer Vergleich:
In beiden Implementierungen können Sie weiterhin auswählen, was Sie vergleichen möchten . Mit Generika können Sie dies deklarieren und zur Kompilierungszeit überprüfen lassen. Dies verbessert die Sicherheit, ist aber auch eine Herausforderung, den geeigneten Wert zu bestimmen.
Als Richtlinie verwende ich im Allgemeinen die allgemeinste Klasse oder Schnittstelle, mit der dieses Objekt verglichen werden kann, in allen Anwendungsfällen, die ich mir vorstelle ... Eine Definition ist jedoch nicht sehr genau! :-(
Comparable<Object>
Sie können es zur Kompilierungszeit in allen Codes verwenden (was bei Bedarf gut oder wenn nicht schlecht ist und Sie den Fehler bei der Kompilierung verlieren). Ihre Implementierung muss mit Objekten umgehen und nach Bedarf, aber auf robuste Weise gegossen werden.Comparable<Itself>
ist im Gegenteil sehr streng.quelle
java.lang.Comparable
Um die
Comparable
Schnittstelle zu implementieren , muss die Klasse eine einzelne Methode implementierencompareTo()
int a.compareTo(b)
Sie müssen die Klasse ändern, deren Instanz Sie sortieren möchten. Damit kann nur eine Sortierfolge pro Klasse erstellt werden.
java.util.Comparator
Um die Comparator-Schnittstelle zu implementieren, muss die Klasse eine einzelne Methode implementieren
compare()
int compare (a,b)
quelle
Comparable
dient zum Bereitstellen einer Standardreihenfolge für Datenobjekte, z. B. wenn die Datenobjekte eine natürliche Reihenfolge haben.A
Comparator
repräsentiert die Bestellung selbst für eine bestimmte Verwendung.quelle
Comparable
wird normalerweise bevorzugt. Aber manchmal implementiert eine Klasse bereitsComparable
, aber Sie möchten nach einer anderen Eigenschaft sortieren. Dann müssen Sie a verwendenComparator
.Einige Klassen sehen tatsächlich
Comparators
häufige Fälle vor; Zum Beispiel wirdString
bei der Sortierung standardmäßig zwischen Groß- und Kleinschreibung unterschieden, es wird jedoch auch eine statische AufforderungComparator
aufgerufenCASE_INSENSITIVE_ORDER
.quelle
Hier sind einige Unterschiede zwischen Comparator und Comparable, die ich im Web gefunden habe:
Wenn Sie sehen, dass der logische Unterschied zwischen diesen beiden darin besteht, dass Comparator in Java zwei ihm zur Verfügung gestellte Objekte vergleicht, während die Comparable-Schnittstelle "diese" Referenz mit dem angegebenen Objekt vergleicht.
In Java vergleichbar wird verwendet, um die natürliche Reihenfolge von Objekten zu implementieren. In Java API String implementieren Date- und Wrapper-Klassen eine vergleichbare Schnittstelle.
Wenn eine Klasse eine vergleichbare Schnittstelle in Java implementiert, kann die Sammlung dieses Objekts, entweder List oder Array, automatisch mithilfe der Collections.sort () - oder Array.sort () -Methode sortiert werden, und das Objekt wird basierend auf der durch die CompareTo-Methode definierten natürlichen Reihenfolge sortiert.
Objekte, die Comparable in Java implementieren, können als Schlüssel in einer sortierten Map oder als Elemente in einer sortierten Gruppe verwendet werden, z. B. TreeSet, ohne einen Comparator anzugeben.
site: Wie verwende ich Comparator und Comparable in Java? Mit Beispiel
Lesen Sie mehr: Wie verwende ich Comparator und Comparable in Java? Mit Beispiel
quelle
Comparable
ist für Objekte mit einer natürlichen Ordnung. Das Objekt selbst weiß, wie es bestellt werden soll.Comparator
ist für Objekte ohne natürliche Reihenfolge oder wenn Sie eine andere Reihenfolge verwenden möchten.quelle
Unterschied zwischen Komparator- und vergleichbaren Schnittstellen
Comparable
wird verwendet, um sich selbst mit einem anderen Objekt zu vergleichen.Comparator
wird verwendet, um zwei Datentypen zu vergleichen, die Objekte sind.quelle
Wenn Sie sehen, dass der logische Unterschied zwischen diesen beiden
Comparator
in Java besteht, vergleichen Sie zwei ihm bereitgestellte Objekte, während dieComparable
Schnittstelle "diese" Referenz mit dem angegebenen Objekt vergleicht.Comparable
in Java wird verwendet, um die natürliche Reihenfolge von Objekten zu implementieren. In Java API implementieren String-, Date- und Wrapper-Klassen dieComparable
Schnittstelle.Wenn eine Klasse eine
Comparable
Schnittstelle in Java implementiert , wird die Sammlung dieses Objekts entwederList
oderArray
mithilfe vonCollections.sort()
oderArray.sort()
Methode und Objekt automatisch sortiert, basierend auf der durch diecompareTo
Methode definierten natürlichen Reihenfolge .Objekte, die
Comparable
in Java implementiert werden, können beispielsweise als Schlüssel in einer sortierten Zuordnung oder als Elemente in einer sortierten Menge verwendet werdenTreeSet
, ohne dass dies angegeben wirdComparator
.quelle
Meine Annotation lib zur Implementierung von Comparable und Comparator:
Klicken Sie auf den Link, um weitere Beispiele anzuzeigen. compamatic
quelle