Java LanguageComparable y comparador


Sintaxis

  • clase pública implementa MyClass Comparable <MyClass >
  • la clase pública MyComparator implementa Comparator <SomeOtherClass >
  • public int compareTo (MyClass other)
  • public int compare (SomeOtherClass o1, SomeOtherClass o2)

Observaciones

Al implementar un compareTo(..) que depende de un double , no haga lo siguiente:

public int comareTo(MyClass other) {
    return (int)(doubleField - other.doubleField); //THIS IS BAD
}

El truncamiento causado por (int) cast causará que el método a veces devuelva incorrectamente 0 lugar de un número positivo o negativo, y por lo tanto puede llevar a errores de comparación y clasificación.

En su lugar, la implementación correcta más simple es usar Double.compare , como tal:

public int comareTo(MyClass other) {
    return Double.compare(doubleField,other.doubleField); //THIS IS GOOD
} 

Una versión no genérica de Comparable<T> , simplemente Comparable , ha existido desde Java 1.2 . Además de interactuar con el código heredado, siempre es mejor implementar la versión genérica Comparable<T> , ya que no requiere conversión en la comparación.


Es muy estándar que una clase sea comparable a sí misma, como en:

public class A implements Comparable<A>

Si bien es posible romper con este paradigma, tenga cuidado al hacerlo.


Un Comparator<T> todavía se puede usar en instancias de una clase si esa clase implementa Comparable<T> . En este caso, se utilizará la lógica del Comparator ; El orden natural especificado por la implementación Comparable será ignorado.

Comparable y comparador Ejemplos relacionados