Quelle est la meilleure façon d'obtenir min et valeur maximale à partir d'une liste de Comparables que principale contiennent des valeurs nulles?
-
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?
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: