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.Comparableinterface 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.Comparatorinterface.
Implémentation Comparablesignifie « 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 Comparatorsignifie " 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.
Personoutil Comparable, car vous ne pouvez pas changer la façon dont deux personnes sont comparées.
Person. 2) Le comparateur, par exemple PersonAgeComparatorqui 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' Comparableinterface, 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)
Comparableest 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 Comparatorsdes cas courants; par exemple, les Strings sont par défaut sensibles à la casse lorsqu'ils sont triés, mais il y a aussi un statique Comparatorappelé 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
Comparableest pour les objets avec un ordre naturel. L'objet lui-même sait comment il doit être ordonné.
Comparatorest 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 Comparatoren Java, comparez deux objets qui lui sont fournis, tandis que l' Comparableinterface compare "cette" référence à l'objet spécifié.
Comparableen 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 Comparableinterface en Java, alors la collection de cet objet Listou Arraypeut ê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 Comparableen 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