Ich habe Klassen gesehen, die sowohl Comparable als auch Comparator implementieren . Was bedeutet das? Warum sollte ich eins über das andere verwenden?
Ich habe Klassen gesehen, die sowohl Comparable als auch Comparator implementieren . Was bedeutet das? Warum sollte ich eins über das andere verwenden?
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 .
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.
Person
Implementieren tun Comparable
, da Sie dann nicht ändern können, wie zwei Personen verglichen werden.
Person
. 2) Der Komparator, der beispielsweise PersonAgeComparator
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.Komisch, wenn Sie sich selbst der Unterklasse unterordnen, muss die Unterklasse auch vergleichbar und robust sein (sonst würde das Liskov-Prinzip brechen und Ihnen Laufzeitfehler geben).
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)
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.
Comparable
wird normalerweise bevorzugt. Aber manchmal implementiert eine Klasse bereits Comparable
, aber Sie möchten nach einer anderen Eigenschaft sortieren. Dann müssen Sie a verwenden Comparator
.
Einige Klassen sehen tatsächlich Comparators
häufige Fälle vor; Zum Beispiel wird String
bei der Sortierung standardmäßig zwischen Groß- und Kleinschreibung unterschieden, es wird jedoch auch eine statische Aufforderung Comparator
aufgerufen CASE_INSENSITIVE_ORDER
.
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
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.
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.
Wenn Sie sehen, dass der logische Unterschied zwischen diesen beiden Comparator
in Java besteht, vergleichen Sie zwei ihm bereitgestellte Objekte, während die Comparable
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 die Comparable
Schnittstelle.
Wenn eine Klasse eine Comparable
Schnittstelle in Java implementiert , wird die Sammlung dieses Objekts entweder List
oder Array
mithilfe von Collections.sort()
oder Array.sort()
Methode und Objekt automatisch sortiert, basierend auf der durch die compareTo
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 werden TreeSet
, ohne dass dies angegeben wird Comparator
.
Meine Annotation lib zur Implementierung von Comparable und Comparator:
public class Person implements Comparable<Person> {
private String firstName;
private String lastName;
private int age;
private char gentle;
@Override
@CompaProperties({ @CompaProperty(property = "lastName"),
@CompaProperty(property = "age", order = Order.DSC) })
public int compareTo(Person person) {
return Compamatic.doComparasion(this, person);
}
}
Klicken Sie auf den Link, um weitere Beispiele anzuzeigen. compamatic