Quand une classe devrait-elle être comparable et / ou comparable? [fermé]
-
10-07-2019 - |
Question
J'ai vu des classes implémenter à la fois Comparable et Comparateur . Qu'est-ce que ça veut dire? Pourquoi devrais-je utiliser l'un sur l'autre?
La solution
Le texte ci-dessous provient de Comparateur 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
pour 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 & # 8217; s. Cette classe de comparaison doit implémenter l'interface java.util.Comparator
.
Autres conseils
Implémentation Comparable
signifie & "; je peux me comparer à un autre objet. &"; Ceci est généralement utile s’il existe une seule comparaison par défaut naturel.
Implémentation 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 les personnes par âge, nom, etc.
Comparable permet à une classe d'implémenter sa propre comparaison:
- c'est dans la même classe (c'est souvent un avantage)
- il ne peut y avoir qu'une seule implémentation (vous ne pouvez donc pas l'utiliser si vous souhaitez deux cas différents)
Par comparaison, Comparator est une comparaison externe:
- il s'agit généralement d'une instance unique (dans la même classe ou à un autre endroit)
- vous nommez chaque mise en œuvre de la façon dont vous souhaitez trier les éléments
- vous pouvez fournir des comparateurs pour les classes que vous ne contrôlez pas
- l'implémentation est utilisable même si le premier objet est null
Dans les deux implémentations, vous pouvez toujours choisir ce que vous souhaitez 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.
À 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 compilation); votre implémentation doit prendre en charge les objets et transtyper au besoin, mais de manière robuste. -
Comparable<Itself>
est très strict au contraire.
C'est drôle, lorsque 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
Comparable
l'interface, la classe doit implémenter une seule méthodecompareTo()
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)
- Vous construisez une classe distincte de la classe dont vous voulez trier l'instance. Ainsi, plusieurs séquences de tri peuvent être créées par classe.
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à Comparator
, mais vous souhaitez effectuer un tri sur une propriété différente. Ensuite, vous êtes obligé d'utiliser un Comparators
.
Certaines classes fournissent en réalité String
des cas courants; par exemple, les CASE_INSENSITIVE_ORDER
sont par Par défaut, il est sensible à la casse lorsqu'il est trié, mais il existe également un <=> statique appelé <=> .
Voici quelques différences entre Comparator et Comparable trouvées sur le Web:
-
Si vous voyez alors une différence logique entre ces deux choses, Comparator en Java compare deux objets qui lui sont fournis, alors que Comparable interface compare & "this &"; référence avec l'objet spécifié.
-
Comparable en 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 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 sera trié en fonction de leurs propriétés naturelles. ordre 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 dans des éléments d'un jeu 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 in 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 constatez que la différence logique entre ces deux éléments est Comparator
en Java, comparez deux objets qui lui sont fournis, tandis que Comparable
l'interface compare & "this &"; référence avec l'objet spécifié.
List
en Java est utilisé pour implémenter l'ordre naturel des objets. Dans Java API String, les classes Date et wrapper implémentent Array
l'interface.
Si une classe implémente Collections.sort()
l'interface en Java, la collection de cet objet Array.sort()
ou compareTo
peut être triée automatiquement à l'aide de la méthode TreeSet
ou <=> et l'objet sera trié en fonction de leur ordre naturel. défini par la <=> méthode.
Les objets qui implémentent <=> en Java peuvent être utilisés comme clés dans une carte triée ou dans des éléments d'un groupe trié, par exemple <=>, sans spécifier de <=>.
Ma librairie d'annotation pour l'implémentation de Comparable and 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