[java] Esiste un comparatore naturale nell'API standard?


Answers

Sì, il JDK ce l'ha sicuramente! Ecco qui:

Collections.reverseOrder(Collections.reverseOrder())

Stavo solo scherzando. (Ma è vero. (Basta non usarlo (sempre)))

Question

Ho bisogno di un comparatore come parte di un modello di strategia che può utilizzare l'ordinamento naturale degli oggetti o un ordinamento personalizzato. Per il caso di ordinazione naturale, ho scritto un semplice comparatore:

private static class NaturalComparator<T extends Comparable<? super T>> implements Comparator<T> {
    @Override
    public int compare(T o1, T o2) {
        return o1.compareTo(o2);
    }
}

Sembra abbastanza semplice, ma mi stavo chiedendo se qualcuno ne conoscesse uno nell'API standard. Ho guardato TreeMap, e lo fa senza una tale classe, quindi quando quel codice è stato scritto, la risposta apparente sarebbe no, ma forse è stata aggiunta in seguito.




Non ho familiarità con un comparatore predefinito in Java, ma ovviamente, Comparator da confrontare, spesso è un semplice wrapper.

Non esiste un generale di "ordinamento naturale" nell'API standard, sebbene alcuni tipi incorporati, come i numeri, abbiano un'implementazione di confronto, che diventa quindi il loro ordinamento naturale.

TreeMap e TreeSet e tutti questi dovrebbero generare una RuntimeException se l'oggetto inserito non implementa Comparable. Ad esempio, potresti inserire stringhe o numeri ma non un'altra raccolta.

Il codice di TreeMap non usa un comparatore se uno non è disponibile - usa invece compareTo . Per usare compareTo , esegue il cast su Comparable , che è la fonte delle eccezioni.

    private int compare(K k1, K k2) {
      return (comparator==null ? ((Comparable <K>)k1).compareTo(k2)
                                : comparator.compare((K)k1, (K)k2));
  }





Related