J'ai vu des classes qui implémentent à la fois Comparable et Comparator . Qu'est-ce que ça veut dire? Pourquoi utiliserais-je l'un plutôt que l'autre?
J'ai vu des classes qui implémentent à la fois Comparable et Comparator . Qu'est-ce que ça veut dire? Pourquoi utiliserais-je l'un plutôt que l'autre?
Réponses:
Le texte ci-dessous provient de Comparator vs Comparable
Comparable
Un objet comparable est capable de se comparer à un autre objet. La classe elle-même doit implémenter l' java.lang.Comparable
interface afin de pouvoir comparer ses instances.
Comparateur
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' java.util.Comparator
interface.
Implémentation Comparable
signifie « Je peux me comparer à un autre objet » . Ceci est généralement utile lorsqu'il existe une seule comparaison naturelle par défaut.
Implémenter Comparator
signifie " Je peux comparer deux autres objets. " Ceci est généralement utile lorsqu'il existe plusieurs façons de comparer deux instances d'un type - par exemple, vous pouvez comparer des personnes par âge, nom, etc.
Person
outil Comparable
, car vous ne pouvez pas changer la façon dont deux personnes sont comparées.
Person
. 2) Le comparateur, par exemple PersonAgeComparator
qui est capable de comparer deux entités différentes et de décider laquelle doit venir en premier dans cet ordre de tri particulier. 3) Le code de tri, qui prend une collection d'entités et un comparateur, et trie cette collection à l'aide du comparateur pour déterminer l'ordre.
Comparable permet à une classe d'implémenter sa propre comparaison:
Par comparaison, Comparator est une comparaison externe:
Dans les deux implémentations, vous pouvez toujours choisir ce que vous voulez comparer . Avec les génériques, vous pouvez le déclarer et le faire vérifier au moment de la compilation. Cela améliore la sécurité, mais il est également difficile de déterminer la valeur appropriée.
À titre indicatif, j'utilise généralement la classe ou l'interface la plus générale à laquelle cet objet pourrait être comparé, dans tous les cas d'utilisation que j'envisage ... Une définition pas très précise cependant! :-(
Comparable<Object>
vous permet de l'utiliser dans tous les codes au moment de la compilation (ce qui est bon si nécessaire, ou mauvais sinon et vous perdez l'erreur de compilation); votre implémentation doit faire face aux objets et effectuer un cast selon les besoins, mais de manière robuste.Comparable<Itself>
est très strict au contraire.C'est drôle, quand vous vous sous-classez à Subclass, Subclass doit également être comparable et robuste à ce sujet (ou cela briserait le principe de Liskov et vous donnerait des erreurs d'exécution).
java.lang.Comparable
Pour implémenter l' Comparable
interface, la classe doit implémenter une seule méthodecompareTo()
int a.compareTo(b)
Vous devez modifier la classe dont vous souhaitez trier l'instance. Ainsi, une seule séquence de tri peut être créée par classe.
java.util.Comparator
Pour implémenter l'interface Comparator, la classe doit implémenter une seule méthode compare()
int compare (a,b)
Comparable
est généralement préféré. Mais parfois, une classe implémente déjà Comparable
, mais vous voulez trier sur une propriété différente. Ensuite, vous êtes obligé d'utiliser unComparator
.
Certaines classes prévoient en fait Comparators
des cas courants; par exemple, les String
s sont par défaut sensibles à la casse lorsqu'ils sont triés, mais il y a aussi un statique Comparator
appelé CASE_INSENSITIVE_ORDER
.
voici quelques différences entre Comparator et Comparable que j'ai trouvées sur le Web:
Si vous voyez alors la différence logique entre ces deux est Comparator en Java, comparez deux objets qui lui sont fournis, tandis que l'interface Comparable compare "cette" référence à l'objet spécifié.
Comparable en Java est utilisé pour implémenter l'ordre naturel des objets. Dans les classes API Java String, Date et wrapper implémentent l'interface Comparable.
Si une classe implémente une interface Comparable en Java, la collection de cet objet List ou Array peut être triée automatiquement à l'aide de la méthode Collections.sort () ou Array.sort () et l'objet sera trié en fonction de l'ordre naturel défini par la méthode CompareTo.
Les objets qui implémentent Comparable en Java peuvent être utilisés comme clés dans une carte triée ou des éléments dans un ensemble trié, par exemple TreeSet, sans spécifier de comparateur.
site: Comment utiliser Comparator et Comparable en Java? Avec exemple
Lire la suite: Comment utiliser Comparator et Comparable en Java? Avec exemple
Comparable
est pour les objets avec un ordre naturel. L'objet lui-même sait comment il doit être ordonné.
Comparator
est destiné aux objets sans ordre naturel ou lorsque vous souhaitez utiliser un ordre différent.
Différence entre les interfaces de comparaison et de comparaison
Comparable
est utilisé pour se comparer en utilisant avec un autre objet.
Comparator
est utilisé pour comparer deux types de données sont des objets.
Si vous voyez alors la différence logique entre ces deux est Comparator
en Java, comparez deux objets qui lui sont fournis, tandis que l' Comparable
interface compare "cette" référence à l'objet spécifié.
Comparable
en Java est utilisé pour implémenter l'ordre naturel des objets. Dans les classes API Java String, Date et wrapper implémententComparable
interface.
Si une classe implémente une Comparable
interface en Java, alors la collection de cet objet List
ou Array
peut être triée automatiquement à l'aide de la méthode Collections.sort()
ou Array.sort()
et l'objet sera trié en fonction de son ordre naturel défini parcompareTo
méthode.
Les objets qui implémentent Comparable
en Java peuvent être utilisés comme clés dans une carte triée ou des éléments dans un ensemble trié par exemple TreeSet
, sans en spécifier aucun Comparator
.
Ma bibliothèque d'annotations pour l'implémentation de Comparable et 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);
}
}
Cliquez sur le lien pour voir plus d'exemples. compamatique