java - example - ¿Cuál es la mejor manera de obtener el valor mínimo y máximo de una lista de Comparables que contienen valores nulos?
comparator vs comparable java (3)
Estoy pensando en algo como esto:
public static <T extends Comparable<T>> T minOf(T...ts){
SortedSet<T> set = new TreeSet<T>(Arrays.asList(ts));
return set.first();
}
public static <T extends Comparable<T>> T maxOf(T...ts){
SortedSet<T> set = new TreeSet<T>(Arrays.asList(ts));
return set.last();
}
Pero no es seguro nulo, que es algo que quiero también.
¿Conoces una mejor manera de resolver este problema?
EDITAR:
Después de los comentarios, también intenté min ():
public static <T extends Comparable<T>> T minOf(T...ts){
return Collections.min(Arrays.asList(ts), new Comparator<T>(){
public int compare(T o1, T o2) {
if(o1!=null && o2!=null){
return o1.compareTo(o2);
}else if(o1!=null){
return 1;
}else{
return -1;
}
}});
}
¿Qué piensa usted de eso?
Si realmente necesita excluir "nulo" del resultado, y no puede evitar que esté en su matriz, entonces tal vez debería iterar a través de la matriz con un simple bucle y realizar un seguimiento de "min" y "max" "en variables separadas. Todavía puede usar el método "compare ()" en cada objeto para compararlo con sus valores "min" y "max" actuales. De esta forma, puede agregar su propio código para verificar nulos e ignorarlos.
EDITAR: aquí hay un código para ilustrar de lo que estoy hablando. Lamentablemente, hay un caso límite que debe tener en cuenta: ¿qué pasa si todos los argumentos aprobados son nulos? ¿Qué devuelve tu método?
public static <T extends Comparable<T>> T minOf(T...ts){
T min = null;
for (T t : ts) {
if (t != null && (min == null || t.compareTo(min) < 0)) {
min = t;
}
}
return min;
}
public static <T extends Comparable<T>> T maxOf(T...ts){
T max = null;
for (T t : ts) {
if (t != null && (max == null || t.compareTo(max) > 0)) {
max = t;
}
}
return max;
}
¿Qué pasa con Collections.max ?
¿Y por qué te importa la seguridad nula? ¿Estás seguro de que quieres permitir nulos en tu Colección?
No debe implementar Comparable
para aceptar nulo, ya que rompe el contrato de la interfaz.
Desde https://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html :
Tenga en cuenta que null no es una instancia de ninguna clase, y e.compareTo (null) debería arrojar una NullPointerException aunque e.equals (null) devuelve false.
En su lugar, debe crear una nueva interfaz, por ejemplo, ComparableNull
.
Ver también: