什么是最好的方式,获得最小和最大价值从一个名单的可比较,主要包含空价值?
-
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
反而。
也可以看看:
不隶属于 StackOverflow