基于可以为null的字段排序对象列表

时间:2014-11-03 06:32:14

标签: java sorting

如何根据可以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;
                }
            }                       
        }
    };

有更好的方法吗?

3 个答案:

答案 0 :(得分:4)

如果您愿意使用Google Guava,那么您可以使用ComparisonChainOrdering来更简洁。

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来简化代码。