从主要包含空值的可比对象列表中获取最小值和最大值的最佳方法是什么?
我正在考虑这样的事情:
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;
}
}});
}
你对此有何看法?
I am thinking about something like this:
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();
}
But is not null safe, which is something I want too.
Do you know a better way to solve this problem?
EDIT:
After the comments I have also tried 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;
}
}});
}
What do you think of that?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
集合有什么问题.max?
为什么你关心空安全? 您确定要允许您的集合中包含空值吗?
What's wrong with Collections.max?
And why do you care about null safety? Are you sure you want to allow nulls to be in your Collection?
如果您确实需要从结果中排除“null”,并且无法阻止它出现在数组中,那么也许您应该使用简单的循环迭代数组并跟踪“min”和“max” ”在单独的变量中。 您仍然可以对每个对象使用“compare()”方法,将其与当前的“最小值”和“最大值”进行比较。 这样,您可以添加自己的代码来检查空值并忽略它们。
编辑:这里有一些代码来说明我在说什么。 不幸的是,您需要考虑一种边缘情况 - 如果传入的所有参数都为空怎么办? 你的方法返回什么?
If you really need to exclude "null" from the result, and you can't prevent it from being in your array, then maybe you should just iterate through the array with a simple loop and keep track of the "min" and "max" in separate variables. You can still use the "compare()" method on each object to compare it with your current "min" and "max" values. This way, you can add your own code for checking for nulls and ignoring them.
EDIT: here's some code to illustrate what I'm talking about. Unfortunately there is an edge case you need to consider - what if all of the arguments passed in are null? What does your method return?
您不应该实现
Comparable
来接受null,因为它破坏了接口的契约。来自 https://docs.oracle.com/javase /7/docs/api/java/lang/Comparable.html :
您必须改为创建一个新接口,例如
ComparableNull
。另请参阅:
You should not implement
Comparable
to accept null, as it breaks the interface's contract.From https://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html :
You must instead create a new interface, e.g.
ComparableNull
instead.See also: