N'naturel comparateur existent dans l'api standard?
j'ai besoin d'un comparateur dans le cadre d'un schéma de stratégie qui peut soit utiliser l'ordre naturel des objets ou un certain ordre personnalisé. Pour le cas d'ordre naturel, j'ai écrit un comparateur simple:
private static class NaturalComparator<T extends Comparable<? super T>> implements Comparator<T> {
@Override
public int compare(T o1, T o2) {
return o1.compareTo(o2);
}
}
Semble assez simple, mais je me demandais si quelqu'un connaissait un dans l'API standard. J'ai regardé TreeMap, et il le fait sans une telle classe, donc quand ce code a été écrit, la réponse apparente serait non, mais peut-être il a été ajouté plus tard.
5 réponses
ajouté à comparateur en Java 8 :
static <T extends Comparable<? super T>> Comparator<T> naturalOrder()
utilisez - le comme ceci, par exemple:
Comparator<Double> natural = Comparator.<Double>naturalOrder();
return natural.compare(1.0, 1.1));
Oui, le JDK certainement il a! Le voici:
Collections.reverseOrder(Collections.reverseOrder())
je plaisante. (Mais c'est vrai. (Il suffit de ne pas l'utiliser effectivement. (Jamais.)))
JDK ne l'a pas, mais il est appelé ComparableComparator et il existe dans de nombreux cadres tels que printemps , Apache communes , hibernation et beaucoup d'autres
Je ne suis pas familier avec un comparateur par défaut en Java, mais évidemment, comparateur à compareTo est souvent un simple enveloppeur.
il n'y a pas de général d ' "ordre naturel" dans L'API standard, bien que certains types intégrés, comme les nombres, aient une implémentation de compareTo qui devient alors leur ordre naturel.
TreeMap
et TreeSet
et toutes ces mesures devraient jeter un RuntimeException si l'objet que vous mettez à ne pas mettre en œuvre Comparable. Ainsi, par exemple, vous pouvez ajouter des chaînes ou des nombres, mais pas une autre collection.
le code de TreeMap
n'utilise pas de comparateur s'il n'est pas disponible - il utilise compareTo
à la place. Pour utiliser compareTo
, il fait un cast à Comparable
, qui est la source des exceptions.
private int compare(K k1, K k2) {
return (comparator==null ? ((Comparable <K>)k1).compareTo(k2)
: comparator.compare((K)k1, (K)k2));
}
je pense que si une classe a un ordre naturel, il est plus courant en Java qu'elle implémente Comparable
plutôt que d'avoir une implémentation Comparator
pour chaque classe.
ainsi, si les objets en question ont un ordre naturel défini, ils doivent mettre en œuvre Comparable
et avoir la méthode compareTo
définie. Pas besoin de chercher un Comparator
. La plupart des cours en java.util prendre une option Comparator
s'il est spécifique de l'ordre de imposé, ou simplement essayer d'appeler compareTo
sur les objets s'il n'y a pas d'autre ordre spécifié.
Donc, c'est une longue histoire courte: mettre en Œuvre Comparable
chaque fois que vous voulez imposer un ordre naturel sur une classe, utilisez uniquement un Comparator
quand vous voulez quelque chose d'autre que l'ordre naturel.