118 votes

Quelle est la différence entre compare() et compareTo() ?

Quelle est la différence entre la méthode Java compare() y compareTo() méthodes ? Ces méthodes donnent-elles la même réponse ?

170voto

VonC Points 414372

De JavaNotes :

  • a.compareTo(b) :
    Interface comparable : Compare des valeurs et renvoie un int qui indique si les valeurs sont inférieures, égales ou supérieures à.
    Si les objets de votre classe ont un ordre naturel , mettre en œuvre la Comparable<T> et définir cette méthode. Toutes les classes Java qui ont un ordre naturel mettent en œuvre la méthode Comparable<T> - Exemple : String , classes enveloppantes , BigInteger

  • compare(a, b) :
    Interface du comparateur : Compare les valeurs de deux objets. Cette fonction est mise en œuvre dans le cadre de la fonction Comparator<T> et l'interface L'utilisation typique est de définir une ou plusieurs petites classes utilitaires qui l'implémentent, pour passer aux méthodes telles que sort() ou pour être utilisé par des structures de données de tri telles que TreeMap y TreeSet . Vous pourriez vouloir créer un objet Comparator pour les cas suivants :

    • Comparaisons multiples . Fournir plusieurs façons différentes de trier quelque chose. Par exemple, vous pourriez vouloir trier une classe Personne par nom, ID, âge, taille, ... Vous définissez un comparateur pour chacun de ces éléments, que vous transmettez à la fonction sort() méthode.
    • Classe de système Pour fournir des méthodes de comparaison pour les classes sur lesquelles vous n'avez aucun contrôle. Par exemple, vous pourriez définir un comparateur pour les chaînes de caractères qui les compare par leur longueur.
    • Modèle de stratégie Pour mettre en œuvre un modèle de stratégie, c'est-à-dire une situation dans laquelle vous souhaitez représenter un algorithme sous la forme d'un objet que vous pouvez transmettre en tant que paramètre, enregistrer dans une structure de données, etc.

Si les objets de votre classe ont un ordre de tri naturel, vous n'aurez peut-être pas besoin de compare().


Résumé de http://www.digizol.com/2008/07/java-sorting-comparator-vs-comparable.html

Comparable
Un objet comparable est capable de se comparer à un autre objet.

Comparateur
Un objet comparateur est capable de comparer deux objets différents. La classe ne compare pas ses instances, mais celles d'une autre classe.


Contextes de cas d'utilisation :

Interface comparable

La méthode des égaux et == y != opérateurs test d'égalité/inégalité, mais ne fournissent pas de moyen de tester les valeurs relatives .
Certaines classes (par exemple, String et d'autres classes avec un ordre naturel) implémentent la fonction Comparable<T> qui définit une interface compareTo() méthode.
Vous voudrez mettre en œuvre Comparable<T> dans votre classe si vous voulez l'utiliser avec Collections.sort() o Arrays.sort() méthodes.

Définition d'un objet Comparator

Vous pouvez créer des comparateurs pour trier de manière arbitraire pour n'importe quelle classe .
Par exemple, le String définit la classe CASE_INSENSITIVE_ORDER comparateur .


La différence entre les deux approches peut être liée à la notion de :
Collection commandée :

Lorsqu'une collection est ordonnée, cela signifie que vous pouvez itérer dans la collection dans un ordre spécifique (non aléatoire). Hashtable n'est pas commandée).

Une collection avec un ordre naturel n'est pas seulement ordonné, mais trié . Définir un ordre naturel peut être difficile ! (dans le mot anglais ordre naturel des cordes ).


Une autre différence, soulignée par HaveAGuess en les commentaires :

  • Comparable se trouve dans l'implémentation et n'est pas visible depuis l'interface, donc lorsque vous effectuez un tri, vous ne savez pas vraiment ce qui va se passer.
  • Comparator vous donne l'assurance que la commande sera bien définie.

16voto

Yuval Adam Points 59423

compareTo() provient de la Comparable interface.

compare() provient de la Comparator interface.

Les deux méthodes font la même chose, mais chaque interface est utilisée dans un contexte légèrement différent.

El Comparable L'interface est utilisée pour imposer un ordre naturel aux objets de la classe d'implémentation. Le site compareTo() est appelée la méthode de comparaison naturelle. Le site Comparateur est utilisée pour imposer un ordre total aux objets de la classe d'implémentation. Pour plus d'informations, consultez les liens pour savoir exactement quand utiliser chaque interface.

14voto

jjnguy Points 62123

Des similitudes :
Les deux sont des moyens personnalisés de comparer deux objets.
Les deux renvoient un int décrivant la relation entre deux objets.

Différences : La méthode compare() est une méthode que vous êtes obligé d'implémenter si vous implémentez la fonction Comparator interface. Elle vous permet de passer deux objets dans la méthode et renvoie un int décrivant leur relation.

Comparator comp = new MyComparator();
int result = comp.compare(object1, object2);

La méthode compareTo() est une méthode que vous êtes obligé d'implémenter si vous implémentez la fonction Comparable interface. Elle permet de comparer un objet à des objets de type similaire.

String s = "hi";
int result = s.compareTo("bye");

Résumé :
En fait, il s'agit de deux façons différentes de comparer les choses.

10voto

Nicolai Points 1265

Les méthodes ne doivent pas nécessairement donner les mêmes réponses. Cela dépend des objets/classes auxquels vous les appelez.

Si vous implémentez vos propres classes dont vous savez que vous voulez les comparer à un moment donné, vous pouvez leur faire implémenter l'interface Comparable et implémenter la méthode compareTo() en conséquence.

Si vous utilisez des classes d'une API qui ne mettent pas en œuvre l'interface Comparable, mais que vous voulez quand même les comparer. Par exemple, pour effectuer un tri. Vous pouvez créer votre propre classe qui implémente l'interface Comparator et dans sa méthode compare() vous implémentez la logique.

6voto

IamVickyAV Points 304

En utilisant le comparateur, on peut avoir n nombre de logiques de comparaison écrites pour une classe .

Par exemple

Pour une classe de voiture

Nous pouvons avoir une classe Comparator pour comparer sur la base du numéro de modèle de la voiture. Nous pouvons également disposer d'une classe de comparaison basée sur l'année du modèle de la voiture.

Classe de voiture

public class Car  {

    int modelNo;

    int modelYear;

    public int getModelNo() {
        return modelNo;
    }

    public void setModelNo(int modelNo) {
        this.modelNo = modelNo;
    }

    public int getModelYear() {
        return modelYear;
    }

    public void setModelYear(int modelYear) {
        this.modelYear = modelYear;
    }

}

Comparateur n°1 basé sur le modèle n°.

public class CarModelNoCompartor implements Comparator<Car>{

    public int compare(Car o1, Car o2) {

        return o1.getModelNo() - o2.getModelNo();
    }

}

Comparateur n°2 basé sur l'année modèle

public class CarModelYearComparator implements Comparator<Car> {

    public int compare(Car o1, Car o2) {

        return o1.getModelYear() - o2.getModelYear();
    }

}

Mais cela n'est pas possible dans le cas de Comparable interface.

Dans le cas de l'interface Comparable, on peut avoir une seule logique dans la méthode compareTo() .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X