Quelle est la meilleure façon d'obtenir min et valeur maximale à partir d'une liste de Comparables que principale contiennent des valeurs nulles?

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

  •  21-08-2019
  •  | 
  •  

Question

Je pense à quelque chose comme ceci:

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

Mais n'est pas sûr nulle, ce qui est quelque chose que je veux aussi.

Savez-vous une meilleure façon de résoudre ce problème?

EDIT:

Après les commentaires que j'ai aussi essayé 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;  
            }
        }});
}

Que pensez-vous de cela?

Était-ce utile?

La solution

Autres conseils

Si vous avez vraiment besoin d'exclure « null » du résultat, et vous ne pouvez pas l'empêcher d'être dans votre tableau, alors peut-être vous devriez juste parcourir le tableau avec une boucle simple et garder une trace du « min » et « max » dans des variables distinctes. Vous pouvez toujours utiliser le « comparer () » méthode sur chaque objet pour le comparer avec votre actuelle « min » et valeurs « max ». De cette façon, vous pouvez ajouter votre propre code pour vérifier les valeurs nulles et les ignorer.

EDIT: Voici un code pour illustrer ce dont je parle. Malheureusement, il y a un cas limite, vous devez considérer - si tous les arguments transmis sont nuls? Qu'est-ce que votre retour méthode?

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

ne devrait pas à accepter la mise en œuvre nulle Comparable, car il rompt le contrat de l'interface.

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

  

Notez que nul n'est pas une instance d'une classe, et e.compareTo (null) devrait lancer une NullPointerException même si retourne e.equals (null) false.

Vous devez créer à la place une nouvelle interface, par exemple Au lieu ComparableNull.

Voir aussi:

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top