我正在考虑这样的事情:
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;
}
}});
}
你怎么看?
答案 0 :(得分:39)
Collections.max出了什么问题?
为什么你关心无效安全?您确定要允许空值出现在集合中吗?
答案 1 :(得分:4)
如果你真的需要从结果中排除“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;
}
答案 2 :(得分:1)
你不应该实现Comparable
接受null,因为它会破坏接口的合同。
来自https://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html:
请注意,null不是任何类的实例,并且e.compareTo(null)应抛出NullPointerException,即使e.equals(null)返回false。
您必须改为创建一个新界面,例如而是ComparableNull
。
另见: