J'ai une liste d'objets que je dois trier sur un champ, par exemple Score. Sans trop réfléchir, j'ai écrit une nouvelle classe qui implémente Comparator, qui fait la tâche et ça marche.
En y repensant, je me demande si je devrais avoir à la place l'implémentation de ma classe Comparable au lieu de créer une nouvelle classe qui implémente Comparator. Le score est le seul champ sur lequel les objets seront classés.
Qu'est-ce que j'ai fait comme pratique acceptable?
La bonne approche est-elle «Commencez par implémenter la classe Comparable (pour l'ordre naturel) et si une comparaison de champ alternative est requise, créez une nouvelle classe qui implémente Comparator»?
Si (2) ci-dessus est vrai, cela signifie-t-il que l'on ne doit implémenter Comparator qu'après avoir implémenté la classe Comparable? (En supposant que je possède la classe d'origine).
la source
À utiliser
Comparable
si vous souhaitez définir un comportement de tri par défaut (naturel) de l'objet en question, une pratique courante consiste à utiliser un identifiant technique ou naturel (base de données?) De l'objet pour cela.À utiliser
Comparator
si vous souhaitez définir un comportement de classement contrôlable externe , cela peut remplacer le comportement de classement par défaut.la source
Comparable
signifie que je définis l'ordre naturel?" , cela m'a donné la réponse que je cherchais. Merci :)Utilisez
Comparable
:Utilisez
Comparator
:Comparable
.Comparable
).la source
Comparable -
java.lang.Comparable: int compareTo(Object o1)
Un objet comparable est capable de se comparer à un autre objet. La classe elle-même doit implémenter l'interface java.lang.Comparable afin de pouvoir comparer ses instances.
only one sort sequence
fonction des propriétés des instances. EX:Person.id
Comparateur -
java.util.Comparator: int compare(Object o1, Object o2)
Un objet comparateur est capable de comparer deux objets différents. La classe ne compare pas ses instances, mais certaines autres instances de la classe. Cette classe de comparateur doit implémenter l'interface java.util.Comparator.
many sort sequence
et nommer chacun, en fonction des propriétés des instances. EX:Person.id, Person.name, Person.age
Exemple:
Pour Java 8 Lambda: Comparator, reportez-vous à mon article.
la source
Comparable doit être utilisé lorsque vous comparez des instances de la même classe.
Le comparateur peut être utilisé pour comparer des instances de différentes classes.
Comparable est implémenté par la classe qui doit définir un ordre naturel pour ses objets. Like String implémente Comparable.
Dans le cas où l'on souhaite un ordre de tri différent, il peut implémenter le comparateur et définir sa propre manière de comparer deux instances.
la source
Si le tri des objets doit être basé sur l'ordre naturel, utilisez Comparable alors que si votre tri doit être effectué sur les attributs de différents objets, utilisez Comparator en Java.
Principales différences entre Comparable et Comparator:
la source
Comparator fait tout ce qui est comparable, et plus encore.
J'ai trouvé la meilleure approche pour utiliser les comparateurs en tant que classes anonymes comme suit:
Vous pouvez créer plusieurs versions de ces méthodes directement dans la classe que vous prévoyez de trier. Vous pouvez donc avoir:
sortAccountsByPriorityAndType
etc...
Maintenant, vous pouvez utiliser ces méthodes de tri n'importe où et obtenir la réutilisation du code. Cela me donne tout ce qui serait comparable, et plus encore ... donc je ne vois aucune raison d'utiliser comparable.
la source
Je dirais:
la source
Les points suivants vous aident à décider dans quelles situations utiliser Comparable et dans quel comparateur:
1) Disponibilité du code
2) Critères de tri simples ou multiples
3) Arays.sort () et Collection.sort ()
4) En tant que clés dans SortedMap et SortedSet
5) Plus de nombre de classes par rapport à la flexibilité
6) Comparaisons interclasses
7) Ordre naturel
Pour un article plus détaillé, vous pouvez vous référer Quand utiliser comparable et quand utiliser le comparateur
la source
la source
Si vous avez besoin d'un tri par ordre naturel - Comparable par l'utilisateur SI vous avez besoin d'un tri par ordre personnalisé - Utilisez le comparateur
Exemple:
Ordre naturel Le tri serait basé sur l'identifiant car il serait unique et l'ordre personnalisé serait le nom et le département.
Réfrences:
Quand une classe doit-elle être comparable et / ou comparative? http://javarevisited.blogspot.com/2011/06/comparator-and-comparable-in-java.html
la source
Il y avait eu une question similaire ici: Quand une classe devrait-elle être comparable et / ou comparative?
Je dirais ce qui suit: implémenter Comparable pour quelque chose comme un ordre naturel, par exemple basé sur un identifiant interne
Implémentez un comparateur si vous avez un algorithme de comparaison plus complexe, par exemple plusieurs champs, etc.
la source
Comparable
.Comparable:
chaque fois que nous voulons stocker uniquement des éléments homogènes et l'ordre de tri naturel par défaut requis, nous pouvons opter pour une
comparable
interface d' implémentation de classe .Comparateur:
Chaque fois que nous voulons stocker des éléments homogènes et hétérogènes et que nous voulons trier dans l'ordre de tri personnalisé par défaut, nous pouvons opter pour l'
comparator
interface.la source
Mon besoin était trié en fonction de la date.
Donc, j'ai utilisé Comparable et cela a fonctionné facilement pour moi.
Une restriction avec Comparable est qu'ils ne peuvent pas être utilisés pour des collections autres que List.
la source
Si vous possédez la classe, mieux vaut opter pour Comparable . Généralement, Comparator est utilisé si vous ne possédez pas la classe mais que vous devez l'utiliser un TreeSet ou TreeMap car Comparator peut être passé en paramètre dans le conctructor de TreeSet ou TreeMap. Vous pouvez voir comment utiliser Comparator et Comparable sur http://precatelyconcise.com/java/collections/g_comparator.php
la source
On m'a demandé de trier une gamme définie de nombres en temps meilleur que nlogn dans une interview. (Ne pas utiliser le tri par comptage)
L'implémentation de l'interface Comparable sur un objet permet aux algos de tri implicites d'utiliser la méthode compareTo remplacée pour ordonner les éléments de tri et ce serait un temps linéaire.
la source
Comparable est l'ordre de tri naturel par défaut fourni pour les valeurs numériques par ordre croissant et pour les chaînes par ordre alphabétique. par exemple:
Le comparateur est l'ordre de tri personnalisé implémenté dans la classe myComparator personnalisée en remplaçant une méthode de comparaison par exemple:
la source
Une approche très simple consiste à supposer que la classe d'entité en question soit représentée dans la base de données, puis dans la table de base de données auriez-vous besoin d'un index composé de champs de la classe d'entité? Si la réponse est oui, implémentez comparable et utilisez le ou les champs d'index pour l'ordre de tri naturel. Dans tous les autres cas, utilisez le comparateur.
la source
Ma bibliothèque d'annotations pour l'implémentation
Comparable
etComparator
:Cliquez sur le lien pour voir plus d'exemples. http://code.google.com/p/compamatic/wiki/CompamaticByExamples
la source