2010-09-08 219 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