2010-11-05 5 views
112

Doublons possibles:
difference between compare() and compareTo()
Java: What is the difference between implementing Comparable and Comparator?Java: Comparable vs Comparator

Quelles sont les différences clés entre Comparable et Comparator.

et qui est préféré à l'autre dans quels scénarios?

Merci

Mise à jour - LINK BON EXEMPLE !!

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

+2

http://grdurand.com/static/presentation_four/comparable.html –

+1

Également un dup de: [Quand utiliser Comparable et Comparator] (http://stackoverflow.com/q/2266827/642706). –

+0

Excellent exemple de lien. Simple et clair. Lis bien. – Androidster

Répondre

158

Lorsque votre classe implémente Comparable, la méthode compareTo de la classe définit l'ordre "naturel" de cet objet. Cette méthode est contractuellement obligatoire (bien que non demandée) pour être en ligne avec d'autres méthodes sur cet objet, comme un 0 devrait toujours être retourné pour les objets lorsque les comparaisons .equals() retournent vrai.

Une Comparator est sa propre définition de la façon de comparer deux objets, et peut être utilisée pour comparer des objets d'une manière qui pourrait ne pas s'aligner avec l'ordre naturel.

Par exemple, les chaînes sont généralement comparées par ordre alphabétique. Ainsi, le "a".compareTo("b") utiliserait des comparaisons alphabétiques. Si vous souhaitez comparer les chaînes sur la longueur, vous devez écrire un comparateur personnalisé.

En bref, il n'y a pas beaucoup de différence. Ils sont les deux extrémités à des moyens similaires. En général mettre en œuvre comparable pour l'ordre naturel, (la définition d'ordre naturel est évidemment ouverte à l'interprétation), et écrire un comparateur pour d'autres besoins de tri ou de comparaison.

+8

Une comparaison doit être implémentée dans l'objet. Il existe donc une dépendance créée avec la méthode compareTo pour un objet qui sera impliquée dans un type particulier d'implémentation de comparaison d'objet. Mais, le comparateur est externalisé et nous pouvons avoir plusieurs types de comparateur pour le même objet. Aussi besoin de corrections pour ma compréhension. – Sridhar

+0

Un cas que j'ai rencontré, est que vous pourriez vouloir trier des champs de manière conditionnelle, auquel cas vous pouvez passer dynamiquement à Comparator afin de trier une collection de la classe, mais si vous voulez simplement définir l'unicité sur un autre propriété dans votre classe, puis implémenter comparable à l'intérieur de la classe. Ils ne sont pas mutuellement exclusifs. – markg

106

Comparator fournit un moyen pour vous de fournir une logique de comparaison personnalisée pour les types que vous avez aucun contrôle.

permet de spécifier comment les objets que vous implémentez sont comparés.

De toute évidence, si vous n'avez aucun contrôle sur une classe (ou si vous souhaitez fournir plusieurs façons de comparer des objets sur lesquels vous avez le contrôle), utilisez Comparator.

Sinon, vous pouvez utiliser Comparable.

+30

** Le contrôle sur la source ** est le mot-clé ici. –

+0

@ JonasGröger Que voulez-vous dire par ne pas avoir un contrôle sur une classe? – TheLogicGuy

+0

@TheLogicGuy Vous n'avez aucun contrôle sur une classe si elle provient d'une dépendance ou d'un autre code que vous ne pouvez/ne pouvez pas modifier. –