如何在使用Java集合排序时处理空值

在Java中使用Collection.sort时,当其中一个内部对象为null时,我应该返回什么

例:

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

让我们说o2不是null而是o2.getDate()它是,所以在添加nullvalidation时我应该返回1还是-1还是0?

当然,这是你的选择。 无论你写什么逻辑,它都会定义排序规则。 所以’应该’在这里不是正确的词。

如果你想在任何其他元素之前出现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()); } 

在Java 8中,您还可以使用nullsFirst()

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

nullsLast()

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

这些方法将null设置为开头或结尾。 没有错误或权利,你是否认为null大于或小于另一个对象。 这完全取决于你,正如其他人已经说过的那样。

这取决于,你认为null是一个大值还是一个低值。

您可以在大多数情况下考虑null

0这将是一个可怕的回报值。

根据Nikita Rybak的回答,我已经有了一个枚举比较器,只能从这里添加空逻辑。

 public enum Orden implements Comparator { 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 ascending() { return this; } public Comparator descending() { return Collections.reverseOrder(this); } } 

在这种forms,我可以在我的列表上调用排序方法。

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