Qual é a melhor maneira de obter min eo valor máximo de uma lista de Comparables que o principal conter valores nulos?

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

  •  21-08-2019
  •  | 
  •  

Pergunta

Estou pensando em algo como isto:

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();
}

Mas não é seguro nulo, o que é algo que eu quero também.

Você sabe a melhor maneira de resolver este problema?

EDIT:

Depois dos comentários Eu também tentei 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;  
            }
        }});
}

O que você acha disso?

Foi útil?

Solução

O que há de errado com Collections.max ?

E por que você se preocupa com a segurança nulo? Tem certeza de que deseja permitir nulos para a sua coleção?

Outras dicas

Se você realmente precisa para excluir "null" a partir do resultado, e você não pode impedi-lo de estar em sua matriz, então talvez você deve apenas percorrer a matriz com um loop simples e manter o controle do "min" e "máximo" em variáveis ??separadas. Você ainda pode usar o método "compare ()" em cada objeto para compará-lo com o seu actual "min" e valores "MAX". Dessa forma, você pode adicionar seu próprio código para a verificação de nulos e ignorá-los.

EDIT: aqui está um código para ilustrar o que estou falando. Infelizmente não há um caso extremo é preciso considerar - o que se todos os argumentos passados ??são nulos? O que faz seu retorno de 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;
}

Você não deve implementar Comparable a aceitar nulo, como ele quebra o contrato do interface.

A partir https://docs.oracle. com / JavaSE / 7 / docs / api / java / lang / Comparable.html :

Note que nulo não é uma instância de qualquer classe, e e.compareTo (null) deve lançar uma NullPointerException embora e.equals (null) retorna false.

Você deve em vez criar uma nova interface, por exemplo, ComparableNull vez.

Veja também:

scroll top