¿Cuál es la mejor manera de obtener el valor mínimo y máximo de una lista de comparables que contienen valores nulos?

StackOverflow https://stackoverflow.com/questions/369383

  •  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?

¿Fue útil?

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:

scroll top