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.
JDK no lo tiene, sin embargo se llama ComparableComparator y existe en muchos marcos como Spring , Apache Commons , Hibernate y muchos otros
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)))