Qual é a melhor maneira de obter min eo valor máximo de uma lista de Comparables que o principal conter valores nulos?
-
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?
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: