Ich habe eine Liste von Objekten, die ich auf einem Feld sortieren muss, z. B. Punktzahl. Ohne viel nachzudenken habe ich eine neue Klasse geschrieben, die Comparator implementiert, die die Aufgabe erledigt und funktioniert.
Wenn ich jetzt zurückblicke, frage ich mich, ob ich stattdessen meine Klasse Comparable implementieren lassen sollte, anstatt eine neue Klasse zu erstellen, die Comparator implementiert. Die Punktzahl ist das einzige Feld, in dem die Objekte bestellt werden.
Was habe ich als Praxis akzeptabel gemacht?
Ist der richtige Ansatz "Lassen Sie zuerst die Klasse Comparable implementieren (für die natürliche Reihenfolge) und wenn ein alternativer Feldvergleich erforderlich ist, erstellen Sie eine neue Klasse, die Comparator implementiert"?
Wenn (2) oben wahr ist, bedeutet dies, dass man Comparator erst implementieren sollte, nachdem die Klasse Comparable implementiert hat? (Vorausgesetzt, ich besitze die ursprüngliche Klasse).
quelle
Verwenden
Comparable
Sie diese Option, wenn Sie ein standardmäßiges (natürliches) Ordnungsverhalten des betreffenden Objekts definieren möchten. In der Regel wird hierfür eine technische oder natürliche (Datenbank?) Kennung des Objekts verwendet.Verwenden
Comparator
Sie diese Option, wenn Sie ein extern steuerbares Bestellverhalten definieren möchten. Dies kann das Standardbestellverhalten überschreiben.quelle
Comparable
, dass ich die natürliche Ordnung definiere?" Dies gab mir die Antwort, die ich suchte. Danke :)Verwendung
Comparable
:Verwendung
Comparator
:Comparable
.Comparable
) unterscheidet.quelle
Vergleichbar -
java.lang.Comparable: int compareTo(Object o1)
Ein vergleichbares Objekt kann sich mit einem anderen Objekt vergleichen. Die Klasse selbst muss die Schnittstelle java.lang.Comparable implementieren, um ihre Instanzen vergleichen zu können.
only one sort sequence
basierend auf den Instanzeigenschaften implementieren . EX:Person.id
Komparator -
java.util.Comparator: int compare(Object o1, Object o2)
Ein Komparatorobjekt kann zwei verschiedene Objekte vergleichen. Die Klasse vergleicht nicht ihre Instanzen, sondern die Instanzen einiger anderer Klassen. Diese Komparatorklasse muss die Schnittstelle java.util.Comparator implementieren.
many sort sequence
jede basierend auf den Instanzeigenschaften implementieren und benennen. EX:Person.id, Person.name, Person.age
Beispiel:
Für Java 8 Lambda: Comparator siehe meinen Beitrag.
quelle
Vergleichbar sollte verwendet werden, wenn Sie Instanzen derselben Klasse vergleichen.
Mit dem Komparator können Instanzen verschiedener Klassen verglichen werden.
Comparable wird von Klassen implementiert, die eine natürliche Reihenfolge für ihre Objekte definieren müssen. Like String implementiert Comparable.
Wenn jemand eine andere Sortierreihenfolge wünscht, kann er einen Komparator implementieren und seine eigene Art des Vergleichs zweier Instanzen definieren.
quelle
Wenn das Sortieren von Objekten auf der natürlichen Reihenfolge basieren muss, verwenden Sie Comparable. Wenn das Sortieren nach Attributen verschiedener Objekte erfolgen muss, verwenden Sie Comparator in Java.
Hauptunterschiede zwischen Comparable und Comparator:
quelle
Der Komparator macht alles, was der Vergleich macht, und noch mehr.
Ich fand den besten Ansatz, Komparatoren als anonyme Klassen zu verwenden, wie folgt:
Sie können mehrere Versionen solcher Methoden direkt in der Klasse erstellen, die Sie sortieren möchten. So können Sie haben:
sortAccountsByPriorityAndType
etc...
Jetzt können Sie diese Sortiermethoden überall verwenden und Code wiederverwenden. Dies gibt mir alles, was vergleichbar wäre, und noch mehr ... also sehe ich keinen Grund, überhaupt vergleichbar zu verwenden.
quelle
Ich würde sagen:
quelle
Die folgenden Punkte helfen Ihnen bei der Entscheidung, in welchen Situationen Comparable und in welchem Comparator verwendet werden soll:
1) Codeverfügbarkeit
2) Einzel- und Mehrfachsortierkriterien
3) Arays.sort () und Collection.sort ()
4) Als Schlüssel in SortedMap und SortedSet
5) Mehr Anzahl von Klassen versus Flexibilität
6) Klassenvergleiche
7) Natürliche Ordnung
Ausführlichere Artikel finden Sie unter Wann ein vergleichbarer und wann ein Komparator zu verwenden ist
quelle
quelle
Wenn Sie eine natürliche Auftragssortierung benötigen - Benutzervergleichbar WENN Sie eine benutzerdefinierte Auftragssortierung benötigen - Verwenden Sie den Komparator
Beispiel:
Die Sortierung nach natürlicher Reihenfolge würde auf der ID basieren, da sie eindeutig wäre und die Sortierung nach benutzerdefinierter Reihenfolge Name und Abteilung wäre.
Refrences:
Wann sollte eine Klasse vergleichbar und / oder vergleichend sein? http://javarevisited.blogspot.com/2011/06/comparator-and-comparable-in-java.html
quelle
Hier hatte es eine ähnliche Frage gegeben: Wann sollte eine Klasse vergleichbar und / oder vergleichend sein?
Ich würde folgendes sagen: Implementiere Comparable für so etwas wie eine natürliche Reihenfolge, zB basierend auf einer internen ID
Implementieren Sie einen Komparator, wenn Sie einen komplexeren Vergleichsalgorithmus haben, z. B. mehrere Felder usw.
quelle
Comparable
.Vergleichbar:
Wann immer wir nur homogene Elemente speichern möchten und die standardmäßige natürliche Sortierreihenfolge erforderlich ist, können wir uns für eine Klasse-Implementierungsschnittstelle entscheiden
comparable
.Komparator:
Wann immer wir homogene und heterogene Elemente speichern und in der benutzerdefinierten Standard-Sortierreihenfolge sortieren möchten, können wir uns für die
comparator
Schnittstelle entscheiden.quelle
Mein Bedarf war nach Datum sortiert.
Also habe ich Comparable verwendet und es hat für mich problemlos funktioniert.
Eine Einschränkung bei Comparable besteht darin, dass sie nicht für andere Sammlungen als List verwendet werden können.
quelle
Wenn Sie die Klasse besitzen, gehen Sie besser mit Comparable . Im Allgemeinen wird Comparator verwendet, wenn Sie die Klasse nicht besitzen, aber ein TreeSet oder TreeMap verwenden müssen, da Comparator als Parameter im Konstruktor von TreeSet oder TreeMap übergeben werden kann. Informationen zur Verwendung von Comparator und Comparable finden Sie unter http://preciselyconcise.com/java/collections/g_comparator.php
quelle
Ich wurde gebeten, in einem Interview einen bestimmten Zahlenbereich besser als nlogn zu sortieren. (Keine Zählsortierung)
Durch die Implementierung einer vergleichbaren Schnittstelle über ein Objekt können implizite Sortieralgen die überschriebene compareTo-Methode verwenden, um Sortierelemente zu ordnen. Dies wäre eine lineare Zeit.
quelle
Vergleichbar ist die standardmäßige natürliche Sortierreihenfolge, die für aufsteigende numerische Werte und für alphabetische Zeichenfolgen angegeben ist. für zB:
Comparator ist die benutzerdefinierte Sortierreihenfolge, die in der benutzerdefinierten myComparator-Klasse implementiert wird, indem eine Vergleichsmethode überschrieben wird, z.
quelle
Ein sehr einfacher Ansatz besteht darin, anzunehmen, dass die betreffende Entitätsklasse in der Datenbank und dann in der Datenbanktabelle dargestellt wird. Benötigen Sie einen Index, der aus Feldern der Entitätsklasse besteht? Wenn die Antwort Ja lautet, implementieren Sie vergleichbar und verwenden Sie die Indexfelder für die natürliche Sortierreihenfolge. In allen anderen Fällen verwenden Sie einen Komparator.
quelle
Meine Annotation lib für die Implementierung
Comparable
undComparator
:Klicken Sie auf den Link, um weitere Beispiele anzuzeigen. http://code.google.com/p/compamatic/wiki/CompamaticByExamples
quelle