从主要包含空值的可比较数据列表中获取最小值和最大值的最佳方法是什么?

use*_*427 6 java collections comparable

我在考虑这样的事情:

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();
}
Run Code Online (Sandbox Code Playgroud)

但是不安全,这也是我想要的.

你知道解决这个问题的更好方法吗?

编辑:

评论后我也试过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;  
            }
        }});
}
Run Code Online (Sandbox Code Playgroud)

你对那个怎么想的?

Pyr*_*cal 39

Collections.max出了什么问题?

你为什么关心无效安全?您确定要允许空值出现在您的收藏中吗?

  • @ Yetti99排序会变慢,因为它是'O(n log n)`和'max` +`min`是'O(2n)`.更好的是做一个循环并更新其中的最大值和最小值.并且OP似乎不需要在单个功能中. (2认同)

Mar*_*ski 5

如果您确实需要从结果中排除“null”,并且无法阻止它出现在数组中,那么也许您应该使用简单的循环迭代数组并跟踪“min”和“max” ”在单独的变量中。您仍然可以对每个对象使用“compare()”方法,将其与当前的“最小值”和“最大值”进行比较。这样,您可以添加自己的代码来检查空值并忽略它们。

编辑:这里有一些代码来说明我在说什么。不幸的是,您需要考虑一种边缘情况 - 如果传入的所有参数都为空怎么办?你的方法返回什么?

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;
}
Run Code Online (Sandbox Code Playgroud)