J'ai vu des classes qui implémentent à la fois Comparable et Comparateur. Qu'est-ce que ça veut dire? Pourquoi devrais-je utiliser l'un sur l'autre?
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'interface Java.lang.Comparable
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 instances de la classe. Cette classe de comparaison doit implémenter l'interface Java.util.Comparator
.
Implémentation de Comparable
signifie "je peux me comparer à un autre objet." Ceci est généralement utile lorsqu'il existe une seule comparaison par défaut naturel.
Implémentation de 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 ex. vous pouvez comparer les personnes par âge, nom, etc.
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 à la compilation. Cela améliore la sécurité, mais il est également difficile de déterminer la valeur appropriée.
A titre indicatif, j'utilise généralement la classe ou l'interface la plus générale à laquelle cet objet peut être comparé, dans tous les cas d'utilisation envisagés ... Une définition peu 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 la compilation); votre implémentation doit prendre en charge les objets et transtyper si nécessaire, mais de manière robuste.Comparable<Itself>
est très strict au contraire.C'est drôle, quand vous sous-classez sous-classe, sous-classe doit également être comparable et robuste (sinon cela enfreindrait le principe de Liskov et vous donnerait des erreurs d'exécution).
Java.lang.Comparable
Pour implémenter l'interface Comparable
, la classe doit implémenter une seule méthode compareTo()
int a.compareTo(b)
Vous devez modifier la classe dont vous voulez 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
sert à fournir un ordre par défaut sur les objets de données, par exemple si les objets de données ont un ordre naturel.
Un Comparator
représente la commande elle-même pour un usage spécifique.
Comparable
est généralement préféré. Mais parfois, une classe implémente déjà Comparable
, mais vous souhaitez effectuer un tri sur une propriété différente. Ensuite, vous êtes obligé d'utiliser un Comparator
.
Certaines classes fournissent en réalité Comparators
pour les cas courants; par exemple, String
s est par défaut sensible à la casse lorsqu'il est trié, mais il existe également un Comparator
statique appelé CASE_INSENSITIVE_ORDER
.
voici quelques différences entre Comparator et Comparable trouvées sur le Web:
Si vous constatez une différence logique entre ces deux éléments, Comparator dans Java compare deux objets qui lui sont fournis, tandis que Comparable interface compare "cette" référence à l'objet spécifié.
Comparable dans Java est utilisé pour implémenter l'ordre naturel des objets. Dans Java API String, les classes Date et wrapper implémentent une interface comparable.
Si une classe implémente l'interface Comparable dans 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 leurs propriétés naturelles. ordre défini par la méthode CompareTo.
Les objets qui implémentent Comparable dans Java peuvent être utilisés comme clés dans une carte triée ou dans des éléments d'un ensemble trié, par exemple TreeSet, sans spécifier de comparateur.
site: Comment utiliser Comparator and Comparable en Java? Avec exemple
En savoir plus: Comment utiliser Comparator and Comparable en Java? Avec exemple
Comparable
est destiné aux objets avec un ordre naturel. L'objet lui-même sait comment il doit être commandé.Comparator
est destiné aux objets sans ordre naturel ou lorsque vous souhaitez utiliser un ordre différent.
Différence entre les interfaces Comparateur et Comparable
Comparable
est utilisé pour se comparer en utilisant un autre objet.
Comparator
est utilisé pour comparer deux types de données sont des objets.
Si vous voyez que la différence logique entre ces deux est Comparator
dans Java comparez deux objets qui lui sont fournis, tandis que Comparable
interface compare "cette" référence à l'objet spécifié.
Comparable
in Java est utilisé pour implémenter l'ordre naturel des objets. Dans Java API String, les classes Date et wrapper implémentent l'interface Comparable
.
Si une classe implémente Comparable
interface dans Java, la collection de cet objet soit List
ou Array
peut être triée automatiquement à l'aide de Collections.sort()
ou Array.sort()
méthode et objet seront triés en fonction de leur ordre naturel défini par la méthode compareTo
.
Les objets qui implémentent Comparable
dans Java peuvent être utilisés comme clés dans une carte triée ou comme éléments dans un jeu trié, par exemple TreeSet
, sans spécifier de Comparator
.
Mon annotation lib 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. compamatic