2014-11-03 75 views
0

如何根據字段排序對象列表,可以是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; 
       } 
      }      
     } 
    }; 

有沒有更好的辦法做到這一點?

回答

4

如果你願意使用Google Guava,那麼你可以使用ComparisonChainOrdering到讓事情更簡潔。

public int compare(CustomClass o1, CustomClass o2) 
{ 
    return ComparisonChain.start() 
    .compare(o1.getCreateDate(), o2.getCreateDate(), Ordering.natural().nullsLast()) 
    .result(); 
} 
0

確實需要所有這些以確保null值總是排序到列表的末尾,否則您按日期排序。您可以通過委託給內置的compareTo或使用聲明式Guava Ordering來簡化代碼。

1

假設getCreateDate()返回java.util.Date的實例,您可以清理一下代碼。 compareTo的方法合同規定,如果將日期與null(與任何Comparable類應該這樣做)進行比較,它會拋出NullPointerException,因此您必須直接處理這些。然而,如果兩個都是非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()); 
     }      
    } 
};