se8 jdk java comparator comparable

java - jdk - ¿Existe un comparador natural en la API estándar?



javax swing (5)

Agregado a Comparator en Java 8 :

static <T extends Comparable<? super T>> Comparator<T> naturalOrder()

Úselo así, por ejemplo:

Comparator<Double> natural = Comparator.<Double>naturalOrder(); return natural.compare(1.0, 1.1));

Necesito un comparador como parte de un patrón de estrategia que puede usar el orden natural de los objetos o algún pedido personalizado. Para el caso de pedido natural, escribí un simple comparador:

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

Parece bastante simple, pero me preguntaba si alguien sabía de uno en la API estándar. Miré TreeMap, y lo hace sin esa clase, por lo que cuando se escribió ese código, la respuesta aparente sería no, pero tal vez se agregó más tarde.


Creo que si una clase tiene un orden natural, es más habitual en Java que implemente Comparable lugar de tener una implementación de Comparator para cada clase.

Por lo tanto, si los objetos en cuestión tienen un orden natural definido, deben implementar Comparable y tener el método compareTo definido. No hay necesidad de buscar un Comparator . La mayoría de las clases en java.util toman un Comparator opcional si hay algún pedido específico que se imponga, o simplemente intentan invocar compareTo en los objetos si no se especifica ningún otro pedido.

Por lo tanto, para resumir: implemente Comparable siempre que quiera imponer un orden natural en una clase, solo use un Comparator cuando desee algo diferente al orden natural.



No estoy familiarizado con un comparador predeterminado en Java, pero obviamente, Comparator to compareTo es a menudo un mero contenedor.

No hay un general de "ordenamiento natural" en la API estándar, aunque ciertos tipos incorporados, como los números, tienen una implementación de compareTo que luego se convierte en su ordenamiento natural.

TreeMap y TreeSet y todos estos deberían arrojar una RuntimeException si el objeto que pones no implementa Comparable. Por lo tanto, por ejemplo, puedes lanzar cadenas o números pero no otra colección.

El código de TreeMap no usa un comparador si uno no está disponible; usa compareTo lugar. Para usar compareTo , realiza un lanzamiento a Comparable , que es la fuente de las excepciones.

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


Sí, el JDK definitivamente lo tiene! Aquí está:

Collections.reverseOrder(Collections.reverseOrder())

Es una broma. (Pero es verdad. (Simplemente no use eso. (Nunca)))