2010-09-08 221 views
17

當在Java中使用Collection.sort我應該回當內對象之一爲null如何使用Java集合時處理空值排序

例子:

Collections.sort(list, new Comparator<MyBean>() { 
    public int compare(MyBean o1, MyBean o2) { 
     return o2.getDate().compareTo(o1.getDate()); 
    } 

}); 

比方說O2不爲空但它是o2.getDate(),所以當添加一個null驗證時,我應該返回1還是-1或0?

回答

25

當然,這是你的選擇。無論你寫什麼邏輯,它都會定義排序規則。所以'應該'在這裏並不是真正的詞。

如果你想爲null任何其他元素之前出現,這樣的事情可以做

public int compare(MyBean o1, MyBean o2) { 
    if (o1.getDate() == null) { 
     return (o2.getDate() == null) ? 0 : -1; 
    } 
    if (o2.getDate() == null) { 
     return 1; 
    } 
    return o2.getDate().compareTo(o1.getDate()); 
} 
+1

如果你想排序,在前面提升它的空值,但是在降序時它們在最後。在本質上完全翻轉名單? – Jeremy 2015-03-17 15:29:12

+0

我使用這段代碼並嘗試了Collections.reverseOrder(),並且它沒有與Collections.reverse(List)一樣工作。 – Jeremy 2015-03-17 15:51:41

+0

@Jeremy是你是對的我面臨同樣的問題所有的空值數據先來,重要的數據到最後。 – 2016-03-10 06:45:17

2

這取決於,你認爲null作爲一個大值或低值。

您可以考慮大部分時間爲空<其他一切,但它取決於上下文。

0這裏是一個可怕的返回值。

1

在Nikita Rybak的回答之後,我已經有了一個枚舉比較器,並且只能從這裏添加null邏輯。

public enum Orden implements Comparator<CmunParametrosDTO> { 
     ByStrDescripcion { 
      public int compare(CmunParametrosDTO item1, CmunParametrosDTO item2) { 
       if (item1.getStrDescripcion() == null && item2.getStrDescripcion() == null) 
        return 0; 
       if (item1.getStrDescripcion() == null) 
        return 1; 
       else if (item2.getStrDescripcion() == null) 
        return -1; 
       return item1.getStrDescripcion().compareTo(item2.getStrDescripcion()); 
      } 
     } 
     public abstract int compare(CmunParametrosDTO item1, CmunParametrosDTO item2); 

     public Comparator<CmunParametrosDTO> ascending() { 
      return this; 
     } 

     public Comparator<CmunParametrosDTO> descending() { 
      return Collections.reverseOrder(this); 
     } 
} 

在這種形式中,我可以調用我的列表中的排序方法。

if(isBolOrdAscendente()) Collections.sort(listado, CmunParametrosDTO.Orden.ByStrDescripcion .ascending()); 
    else Collections.sort(listado, CmunParametrosDTO.Orden.ByStrDescripcion .descending()); 
+0

非常感謝ELD ..搜索了很多...我的解決方案爲我工作:D :) – 2013-10-10 14:17:09

12

在Java 8還可以使用nullsFirst()

Comparator.nullsFirst(Date::compareTo).compare(dateOne, dateTwo); 

或者nullsLast()

Comparator.nullsLast(Date::compareTo).compare(dateOne, dateTwo); 

這些方法要麼排序null的開頭或結尾。無論您是否認爲null大於或小於其他對象,都沒有錯誤或正確。正如其他人所說,這完全取決於你。

+0

不錯,看起來像Java已經在這方面發展了一點 – 2016-08-15 21:31:25