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.

47
demandé sur Yishai 2010-07-14 00:09:44

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));
52
répondu Julien 2016-05-08 14:37:49

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.)))

47
répondu Kevin Bourrillion 2010-07-13 21:22:46

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

9
répondu Eugene Ryzhikov 2010-07-13 20:21:51

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));
  }
2
répondu Uri 2010-07-13 20:26:27

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.

2
répondu MAK 2010-07-13 21:01:48