什么是最好的方式,获得最小和最大价值从一个名单的可比较,主要包含空价值?

StackOverflow https://stackoverflow.com/questions/369383

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

你怎么想的?

有帮助吗?

解决方案

什么是错的 集合。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 :

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

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

也可以看看:

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top