English 中文(简体)
从包含null值的Comparable列表中得到最小值和最大值的最佳方法是什么?
原标题:
  • 时间:2008-12-15 19:08:30
  •  标签:

我正在考虑这样的事情:

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

你觉得怎么样?

最佳回答

Collections.max有什么问题吗?

你为什么关心空值安全性?你确定要允许空值存在于你的集合中吗?

问题回答

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

编辑:这里有一些代码来说明我的意思。不幸的是,你需要考虑一个边缘情况 - 如果传入的所有参数都是 null 呢?你的方法会返回什么?

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

注意,空值不是任何类的实例,而且e.compareTo(null)应该抛出NullPointerException,尽管e.equals(null)返回false。

你必须创建一个新的接口,例如ComparableNull

请参见:





相关问题
热门标签