Qual è il modo migliore per ottenere valori minimi e massimi da un elenco di comparables che principale contengono valori nulli?

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

  •  21-08-2019
  •  | 
  •  

Domanda

Sto pensando a qualcosa di simile:

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

Ma non è sicuro nulla, che è qualcosa che voglio troppo.

Lo sai un modo migliore per risolvere questo problema?

EDIT:

Dopo che i commenti che ho provato anche 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;  
            }
        }});
}

Cosa ne pensi di questo?

È stato utile?

Soluzione

Cosa c'è di sbagliato con Collections.max ?

E perché vi preoccupate per la sicurezza nullo? Sei sicuro che si desidera consentire i null di essere nella vostra collezione?

Altri suggerimenti

Se avete veramente bisogno di escludere "null" dal risultato, e non si può impedire che venga nella propria matrice, allora forse si dovrebbe semplicemente scorrere l'array con un semplice ciclo e tenere traccia del "min" e "max" in variabili separate. È comunque possibile utilizzare il metodo del "confronto ()" a ogni oggetto per confrontarlo con il tuo attuale "min" e valori "MAX". In questo modo, è possibile aggiungere il proprio codice per la verifica di valori null e ignorarli.

EDIT: ecco qualche codice per illustrare che cosa sto parlando. Purtroppo non è un caso limite è necessario considerare - cosa succederebbe se tutti gli argomenti passati sono nulli? Che cosa fa il tuo metodo di tornare?

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

non dovrebbe implementare Comparable ad accettare nulla, come si rompe il contratto del dell'interfaccia.

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

  

Si noti che null non è un'istanza di qualsiasi classe, e e.compareTo (null) deve gettare un NullPointerException anche se e.equals (null) restituisce false.

È necessario invece creare una nuova interfaccia, ad esempio, ComparableNull invece.

Vedi anche:

scroll top