Java LanguageComparabile e comparatore

Sintassi

  • La classe pubblica MyClass implementa <MyClass > comparabile
  • MyComparator di classe pubblica implementa il comparatore <SomeOtherClass >
  • public int compareTo (MyClass altro)
  • int pubblico (SomeOtherClass o1, SomeOtherClass o2)

Osservazioni

Quando si implementa un compareTo(..) che dipende da un double , non effettuare le seguenti operazioni:

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

Il troncamento causato dal cast (int) farà sì che il metodo restituisca a volte in modo errato 0 anziché un numero positivo o negativo e possa quindi portare a confronti e errori di ordinamento.

Invece, l'implementazione corretta più semplice è utilizzare Double.compare , in quanto tale:

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

Una versione non generica di Comparable<T> , semplicemente Comparable , esiste da Java 1.2 . A parte l'interfaccia con il codice legacy, è sempre meglio implementare la versione generica Comparable<T> , poiché non richiede il casting al confronto.


È molto normale che una classe sia paragonabile a se stessa, come in:

public class A implements Comparable<A>

Mentre è possibile uscire da questo paradigma, sii cauto quando lo fai.


Un Comparator<T> può ancora essere utilizzato su istanze di una classe se tale classe implementa Comparable<T> . In questo caso, verrà utilizzata la logica del Comparator ; l'ordine naturale specificato dall'implementazione Comparable sarà ignorato.

Comparabile e comparatore Esempi correlati