Каков наилучший способ получить минимальное и максимальное значение из списка сопоставимых объектов, основной из которых содержит нулевые значения?
-
21-08-2019 - |
Вопрос
Я думаю о чем-то вроде этого:
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();
}
Но это не нулевая безопасность, чего я тоже хочу.
Знаете ли вы лучший способ решить эту проблему?
РЕДАКТИРОВАТЬ:
После комментариев я также попробовал 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;
}
}});
}
Что Вы думаете об этом?
Решение
Что случилось с Коллекции.макс?
И почему вас волнует нулевая безопасность?Вы уверены, что хотите, чтобы в вашей коллекции были значения NULL?
Другие советы
Если вам действительно нужно исключить «ноль» из результата, и вы не можете предотвратить его появление в своем массиве, то, возможно, вам следует просто перебрать массив с помощью простого цикла и отслеживать «мин» и «макс». " в отдельных переменных.Вы по-прежнему можете использовать метод «compare()» для каждого объекта, чтобы сравнить его с текущими значениями «min» и «max».Таким образом, вы можете добавить свой собственный код для проверки нулей и их игнорирования.
РЕДАКТИРОВАТЬ:вот код, иллюстрирующий то, о чем я говорю.К сожалению, есть крайний случай, который вам нужно учитывать: что, если все переданные аргументы равны нулю?Что возвращает ваш метод?
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;
}
Ты не должна осуществлять Comparable
принять значение null, поскольку оно нарушает контракт интерфейса.
От https://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html :
Обратите внимание, что значение null не является экземпляром какого-либо класса, а e.compareTo(null) должно вызывать исключение NullPointerException, даже если e.equals(null) возвращает false.
Вместо этого вы должны создать новый интерфейс, например. ComparableNull
вместо.
Смотрите также: