Está en la página 1de 2

Diferencia entre Comparable y Comparator

La diferencia principal entre Comparable y Comparator es que Comparable es


utilizado para implementar el orden natural, sin necesidad de especificar
un Comparator, por ejemplo, los Stringson comparados alfabéticamente.
Usamos Comparator cuando queramos crear otro tipo de orden que no sea el
natural.

El contrato que implica implementar Comparable requiere de un parámetro extra,


el objeto con el que comparar compareTo(obj1) de forma que la comparación se
realizará del objeto en si (this) con el objeto pasado como parámetro. Comparator,
sin embargo obliga a implementar el métodocompare (obj1, obj2) de forma que los
dos objetos a comparar son pasados como parámetros y el objeto que implementa
el método compare simplemente sirve de apoyo a la comparación.

Sobreescritura de los métodos compareTo ycompare

La forma de sobrescribir estos métodos es muy similar al equals. Los dos métodos
cumplen las mismas restricciones que podemos obj tener del API de Java:

 Devolvemos un número negativo si el objeto es menor, devolvemos un cero si


es igual y un número positivo si el objeto es mayor.

 Comparamos el objeto con otro objeto del mismo tipo. Si no son del mismo tipo,
lanzamos un ClassCastException.

La notación sgn(expresion) es la función matemática signum, la cual devuelve -1,0,


o 1 según sea negativo, zero o positivo

 Debemos asegurar que: sgn(compare(x,y)) == -sgn(compare(x,y)), para todo x,


y. Esto implica que compare(x,y)) lanzará una excepción
sii compare(x,y) también la lanza.

 Debemos asegurar que la relación es transitiva: compare(x,y) > 0 &&


compare(y,z) > 0 implica que compare(x,z) > 0

 Debemos asegurar que: compare(x,y) == 0 implica que sgn(compare(x,z)) ==


sgn(compare(y,z)), para todo z.

 Se recomienda, aunque no es estrictamente neceario, nos puede evitar poblemas
al usar colecciones que implementen esta interfaz. (compare(x,y) == 0) ==
(x.equals(y))

 El orden natural para una clase “c” tiene que ser consistente con el equals si y
solo sí:compare(e1,e2) == 0 tiene que ser el mismo resultado que
para e1.equals(e2) para cada e1 ye2 de la clase “c”.

También podría gustarte