6

我正在考虑这样的事情:

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

你对那个怎么想的?

4

3 回答 3

38

Collections.max有什么问题?

为什么你关心零安全?您确定要允许空值出现在您的集合中吗?

于 2008-12-15T19:13:19.220 回答
5

如果你真的需要从结果中排除“null”,并且你不能阻止它出现在你的数组中,那么也许你应该用一个简单的循环遍历数组并跟踪“min”和“max” " 在单独的变量中。您仍然可以在每个对象上使用“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;
}
于 2008-12-15T19:19:10.097 回答
1

不应该实现Comparable接受 null,因为它违反了接口的合同。

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

请注意,null 不是任何类的实例,即使 e.equals(null) 返回 false,e.compareTo(null) 也应该抛出 NullPointerException。

相反,您必须创建一个新接口,例如ComparableNull

也可以看看:

于 2015-06-02T12:26:51.170 回答