web-dev-qa-db-fra.com

Quand une classe devrait-elle être comparable et / ou comparable?

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?

132
Nick Heiner

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.

232
Dan

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.

146
Jon Skeet

Comparable permet à une classe d'implémenter sa propre comparaison:

  • c'est dans la même classe (c'est souvent un avantage)
  • il peut y avoir ne seule implémentation (donc vous ne pouvez pas l'utiliser si vous voulez 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 implémentation avec la façon dont vous voulez trier les choses
  • vous pouvez fournir des comparateurs pour classes que vous ne contrôlez pas
  • l'implémentation est tilisable même si le premier objet est null

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).

36
KLE

Java.lang.Comparable

  1. Pour implémenter l'interface Comparable, la classe doit implémenter une seule méthode compareTo()

    int a.compareTo(b)

  2. 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

  1. Pour implémenter l'interface Comparator, la classe doit implémenter une seule méthode compare()

    int compare (a,b)

  2. 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.
19
codiacTushki

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.

14
starblue

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 .

8
Michael Myers

voici quelques différences entre Comparator et Comparable trouvées sur le Web:

  1. 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é.

  2. 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.

  3. 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.

  4. 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

6
javapassion

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.

5

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.

2
Srinivas

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

0
Jianmin Liu