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?

Était-ce utile?

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

  1. Pour implémenter Comparable l'interface, 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.

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:

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

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

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

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top