如何根据可以null
?
我尝试使用Comparator
接口和集合排序方法以下列方式执行此操作。
该类为CustomClass
,要进行排序的字段为createDate
Comparator comparator=new Comparator<CustomClass>(){
public int compare(CustomClass o1, CustomClass o2) {
if(o1.getCreateDate()==null && o2.getCreateDate()==null){
return 0;
}
else if(o1.getCreateDate()==null && o2.getCreateDate()!=null){
return 1;
}
else if(o1.getCreateDate()!=null && o2.getCreateDate()==null){
return -1;
}
else{
if(o1.getCreateDate().equals(o2.getCreateDate())){
return 0;
}
else if(o1.getCreateDate().after(o2.getCreateDate())){
return 1;
}
else{
return -1;
}
}
}
};
有更好的方法吗?
答案 0 :(得分:4)
如果您愿意使用Google Guava,那么您可以使用ComparisonChain
和Ordering
来更简洁。
public int compare(CustomClass o1, CustomClass o2)
{
return ComparisonChain.start()
.compare(o1.getCreateDate(), o2.getCreateDate(), Ordering.natural().nullsLast())
.result();
}
答案 1 :(得分:1)
假设getCreateDate()
返回java.util.Date
的实例,您可以稍微清理一下代码。 compareTo
方法的合同指定如果将日期与NullPointerException
进行比较,它会抛出null
(就像任何Comparable
类应该做的那样) ,所以你必须直接处理这些。但是,如果两者都不是null
,则您不应该重新实现比较逻辑,而是依赖Date
的实现:
Comparator comparator=new Comparator<CustomClass>(){
public int compare(CustomClasso1, CustomClasso2) {
if(o1.getCreateDate()==null && o2.getCreateDate()==null){
return 0;
}
else if(o1.getCreateDate()==null && o2.getCreateDate()!=null){
return 1;
}
else if(o1.getCreateDate()!=null && o2.getCreateDate()==null){
return -1;
}
else{
// Just use java.util.Date's logic:
return o1.getCreateDate().compareTo(o2.getCreateDate());
}
}
};
答案 2 :(得分:0)
您确实需要所有这些以确保null
值始终排序到列表的末尾,否则您按日期排序。您可以通过委托内置compareTo
或使用声明性Guava Ordering
来简化代码。