Каков наилучший способ получить минимальное и максимальное значение из списка сопоставимых, которые в основном содержат нулевые значения? - PullRequest
6 голосов
/ 15 декабря 2008

Я думаю о чем-то вроде этого:

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

Но это не совсем безопасно, чего я тоже хочу.

Знаете ли вы лучший способ решить эту проблему?

EDIT:

После комментариев я тоже попробовал 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;  
            }
        }});
}

Что вы думаете об этом?

Ответы [ 3 ]

39 голосов
/ 15 декабря 2008

Что не так с Collections.max ?

А почему вы заботитесь о нулевой безопасности? Вы действительно хотите, чтобы пустые значения были в вашей коллекции?

4 голосов
/ 15 декабря 2008

Если вам действительно нужно исключить «ноль» из результата, и вы не можете предотвратить его попадание в ваш массив, тогда, возможно, вам следует просто перебрать массив с помощью простого цикла и отслеживать «мин» и "макс" в отдельных переменных. Вы все еще можете использовать метод «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;
}
1 голос

Вы не должны реализовывать Comparable для принятия значения NULL, поскольку это нарушает контракт интерфейса.

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

Обратите внимание, что null не является экземпляром какого-либо класса, и e.compareTo (null) должен вызвать исключение NullPointerException, даже если e.equals (null) возвращает false.

Вместо этого вы должны создать новый интерфейс, например, ComparableNull вместо.

Смотри также:

...