¿Cuál es la mejor manera de obtener el valor mínimo y máximo de una lista de comparables que contienen valores nulos?
-
21-08-2019 - |
Pregunta
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 nulo seguro, que es algo que yo también quiero.
¿Conoce una mejor manera de resolver este problema?
EDITAR:
Después de los comentarios también probé 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?
Solución
¿Qué hay de malo en Collections.max ?
Y por qué se preocupan por la seguridad nula? ¿Seguro que desea permitir valores nulos a estar en tu colección?
Otros consejos
Si realmente necesita excluir "nulo" del resultado y no puede evitar que esté en su matriz, entonces tal vez debería simplemente iterar a través de la matriz con un bucle simple y realizar un seguimiento de los valores "mínimo" y "máximo". " en variables separadas.Aún puedes usar el método "compare()" en cada objeto para compararlo con tus valores "mínimo" y "máximo" actuales.De esta manera, puede agregar su propio código para verificar si hay valores nulos e ignorarlos.
EDITAR:Aquí hay un código para ilustrar de qué estoy hablando.Desafortunadamente, hay un caso límite que debes considerar: ¿qué pasa si todos los argumentos pasados 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;
}
no debe Comparable
aplicar a aceptar nula, ya que se rompe el contrato de la interfaz.
https://docs.oracle. com / JavaSE / 7 / docs / api / java / lang / Comparable.html :
Tenga en cuenta que nulo no es una instancia de cualquier clase, y e.compareTo (nulo) debe lanzar una NullPointerException a pesar de que e.equals (nulo) devuelve falso.
Debe lugar de crear una nueva interfaz, por ejemplo, ComparableNull
lugar.
Vea también: