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

Gia*_*rzo 26 java sorting collections nullpointerexception

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

例:

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

});
Run Code Online (Sandbox Code Playgroud)

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

Nik*_*bak 42

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

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

  • @Jeremy 我得到的解决方案只是交换 -1 和 1 的值。它工作正常,空值数据将出现在底部。 (2认同)

use*_*038 24

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

Comparator.nullsFirst(Date::compareTo).compare(dateOne, dateTwo);
Run Code Online (Sandbox Code Playgroud)

或者nullsLast():

Comparator.nullsLast(Date::compareTo).compare(dateOne, dateTwo);
Run Code Online (Sandbox Code Playgroud)

这些方法将排序null到开头或结尾.无论你考虑null比其他物体更大还是更小,都没有错误或正确.这完全取决于你,正如其他人已经说过的那样.


小智 11

取决于对象是否为 null,或者对象的内容是否为 null。

该对象为空:

    import static java.util.Comparator.*;

    List<Data> listOfData = Arrays.asList(
           new Data("foo"),
           null,
           new Data("bar"),
           new Data("nyu"));

    listOfData.sort(nullsFirst(comparing(Data::getValue)));
    listOfData.forEach(System.out::println);
    //OUTPUT:
    // null
    // Data(bar)
    // Data(foo)
    // Data(nyu)
Run Code Online (Sandbox Code Playgroud)

对象的内容为空:

    List<Data> listOfData = Arrays.asList(
           new Data("foo"),
           new Data(null),
           new Data("bar"),
           new Data("nyu"));


    listOfData.sort(nullsFirst(
         comparing(Data::getValue, nullsFirst(naturalOrder()))));

    listOfData.forEach(System.out::println);
    //OUTPUT:
    // Data(null)
    // Data(bar)
    // Data(foo)
    // Data(nyu)
Run Code Online (Sandbox Code Playgroud)