Solución:
Desde JavaNotes:
-
a.compareTo(b)
:
Interfaz comparable: Compara valores y devuelve un int que indica si los valores se comparan menor que, igual o mayor que.
Si sus objetos de clase tienen un orden natural, implementar elComparable<T>
interfaz y defina este método. Todas las clases de Java que tienen un implemento de ordenación naturalComparable<T>
– Ejemplo:String
, clases contenedoras,BigInteger
-
compare(a, b)
:
Interfaz del comparador: Compara los valores de dos objetos. Esto se implementa como parte delComparator<T>
interfaz, y el El uso típico es definir una o más clases de utilidad pequeñas que implementan esto, para pasar a métodos comosort()
o para usar ordenando estructuras de datos comoTreeMap
yTreeSet
. Es posible que desee crear un objeto Comparador para lo siguiente:-
Varias comparaciones. Proporcionar varias formas diferentes de ordenar algo. Por ejemplo, es posible que desee ordenar una clase Person por nombre, ID, edad, altura, … Debería definir un Comparador para que cada uno de estos pase al
sort()
método. - Clase de sistema Para proporcionar métodos de comparación para clases sobre las que no tiene control. Por ejemplo, podría definir un Comparador para cadenas que las compara por longitud.
- Patrón de estrategia Para implementar un patrón de estrategia, que es una situación en la que desea representar un algoritmo como un objeto que puede pasar como parámetro, guardar en una estructura de datos, etc.
-
Varias comparaciones. Proporcionar varias formas diferentes de ordenar algo. Por ejemplo, es posible que desee ordenar una clase Person por nombre, ID, edad, altura, … Debería definir un Comparador para que cada uno de estos pase al
Si los objetos de su clase tienen un orden de clasificación natural, es posible que no necesite comparar ().
Resumen de http://www.digizol.com/2008/07/java-sorting-comparator-vs-comparable.html
Comparable
Un objeto comparable es capaz de compararse con otro objeto.
Comparador
Un objeto comparador es capaz de comparar dos objetos diferentes. La clase no está comparando sus instancias, sino las instancias de alguna otra clase.
Contextos de casos de uso:
Interfaz comparable
El método de iguales y ==
y !=
operadores prueba de igualdad / desigualdad, pero no proporcionan una forma de probar los valores relativos.
Algunas clases (por ejemplo, String y otras clases con un orden natural) implementan la Comparable<T>
interfaz, que define una compareTo()
método.
Querrás implementar Comparable<T>
en tu clase si quieres usarlo con Collections.sort()
o Arrays.sort()
métodos.
Definición de un objeto comparador
Puede crear comparadores para ordenar cualquier forma arbitraria para cualquier clase.
Por ejemplo, el String
clase define el CASE_INSENSITIVE_ORDER
comparador.
La diferencia entre los dos enfoques se puede vincular a la noción de:
Colección ordenada:
Cuando se ordena una colección, significa que puede iterar en la colección en un orden específico (no aleatorio) (un Hashtable
no está ordenado).
Una colección con orden natural no solo está ordenado, sino ordenado. ¡Definir un orden natural puede ser difícil! (como en el orden de cadena natural).
Otra diferencia, señalada por HaveAGuess en los comentarios:
-
Comparable
está en la implementación y no es visible desde la interfaz, por lo que cuando ordena no sabe realmente qué va a pasar. -
Comparator
le asegura que el orden estará bien definido.
compareTo()
es del Comparable
interfaz.
compare()
es del Comparator
interfaz.
Ambos métodos hacen lo mismo, pero cada interfaz se usa en un contexto ligeramente diferente.
La interfaz Comparable se utiliza para imponer un orden natural a los objetos de la clase de implementación. los compareTo()
El método se denomina método de comparación natural. La interfaz Comparator se utiliza para imponer un orden total a los objetos de la clase de implementación. Para obtener más información, consulte los enlaces para saber exactamente cuándo usar cada interfaz.
Similitudes:
Ambas son formas personalizadas de comparar dos objetos.
Ambos devuelven un int
describiendo la relación entre dos objetos.
Diferencias:
El método compare()
es un método que está obligado a implementar si implementa el Comparator
interfaz. Le permite pasar dos objetos al método y devuelve un int
describiendo su relación.
Comparator comp = new MyComparator();
int result = comp.compare(object1, object2);
El método compareTo()
es un método que está obligado a implementar si implementa el Comparable
interfaz. Permite comparar un objeto con objetos de tipo similar.
String s = "hi";
int result = s.compareTo("bye");
Resumen:
Básicamente son dos formas diferentes de comparar cosas.