2010-11-05 16 views
112

posibles duplicados:
difference between compare() and compareTo()
Java: What is the difference between implementing Comparable and Comparator?Java: Comparable vs Comparador

¿Cuáles son las diferencias claves entre Comparable y Comparator.

y cuál es preferido sobre el otro en qué escenarios?

Gracias

Actualizado - buen enlace con el Ejemplo !!

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

+2

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

+1

También un duplicado de: [Cuándo usar Comparable y Comparator] (http://stackoverflow.com/q/2266827/642706). –

+0

Excelente enlace de ejemplo. Simple y claro. Lee. – Androidster

Respuesta

158

Cuando su clase implementa Comparable, el método compareTo de la clase define el orden "natural" de ese objeto. Ese método está contractualmente obligado (aunque no exigido) a estar en línea con otros métodos en ese objeto, como un 0 siempre se debe devolver para los objetos cuando las comparaciones .equals() devuelven verdadero.

A Comparator es su propia definición de cómo comparar dos objetos, y se puede usar para comparar objetos de una manera que podría no coincidir con el orden natural.

Por ejemplo, las cadenas generalmente se comparan alfabéticamente. Por lo tanto, el "a".compareTo("b") usaría comparaciones alfabéticas. Si quisiera comparar cadenas en longitud, necesitaría escribir un comparador personalizado.

En resumen, no hay mucha diferencia. Ambos son fines a medios similares. En general, implementar es comparable para el orden natural, (la definición de orden natural está obviamente abierta a la interpretación), y escribir un comparador para otras necesidades de clasificación o comparación.

+8

Comparable debe implementarse dentro del objeto. Entonces hay una dependencia creada con el método compareTo para un objeto que estará implícito en un tipo particular de implementación de comparación de objetos. Pero, el comparador se externaliza y podemos tener múltiples tipos de comparadores para el mismo objeto. También necesito correcciones para mi comprensión. – Sridhar

+0

Un caso que he encontrado, es que es posible que desee ordenar condicionalmente cualquier campo al azar, en cuyo caso puede pasar el Comparador dinámicamente para ordenar una colección de la clase, pero si simplemente desea definir la singularidad en otro propiedad en su clase, luego implemente Comparable dentro de la clase. No son mutuamente exclusivos. – markg

106

Comparator proporciona una forma para que pueda proporcionar la lógica de comparación personalizada para este tipo que no tiene ningún control sobre.

Comparable le permite especificar cómo se comparan los objetos que está implementando.

Obviamente, si no tiene control sobre una clase (o si desea proporcionar varias formas de comparar objetos sobre los que sí tiene control), utilice Comparator.

De lo contrario, puede usar Comparable.

+30

** El control sobre la fuente ** es la palabra clave aquí. –

+0

@ JonasGröger ¿Qué quiere decir con no tener control sobre una clase? – TheLogicGuy

+0

@TheLogicGuy Usted no tiene control sobre una clase si proviene de una dependencia u otro código que no puede/no puede cambiar. –

Cuestiones relacionadas