Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java集合排序时如何处理空值_Java_Sorting_Collections_Nullpointerexception - Fatal编程技术网

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

使用Java集合排序时如何处理空值,java,sorting,collections,nullpointerexception,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()); } }); Collections.sort(列表,新比较器(){ 公

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

例如:

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

});
Collections.sort(列表,新比较器(){
公共int比较(MyBean o1、MyBean o2){
返回o2.getDate().compareTo(o1.getDate());
} 
});

假设o2不是空的,但o2.getDate()是空的,那么在添加空验证时我应该返回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());
} 

这取决于你认为NULL是一个大的值还是一个低的值。 <>你可以考虑NULL的其他时间,但是它取决于上下文。


在这里,0将是一个糟糕的返回值。

根据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);
        }
}

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

nullsLast()


这些方法将排序
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)
导入静态java.util.Comparator.*;
List listOfData=Arrays.asList(
新数据(“foo”),
无效的
新数据(“bar”),
新数据(纽约大学);
sort(nullsFirst(比较(Data::getValue));
listOfData.forEach(System.out::println);
//输出:
//空的
//数据(bar)
//数据(foo)
//数据(纽约大学)
对象的内容为空:

    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)
List listOfData=Arrays.asList(
新数据(“foo”),
新数据(空),
新数据(“bar”),
新数据(纽约大学);
listOfData.sort(nullsFirst(
比较(Data::getValue,nullsFirst(naturalOrder());
listOfData.forEach(System.out::println);
//输出:
//数据(空)
//数据(bar)
//数据(foo)
//数据(纽约大学)

如果比较两个属性,attr1自然顺序、attr2反向顺序和 attr2可以为空:

datas.sort(comparing(Data::getAttr1, naturalOrder()).
        thenComparing(Data::getAttr2, nullsLast(reverseOrder())));

如果您想按这样的顺序排序,将其前面的空值升序,但将其结尾的空值降序,该怎么办。本质上完全翻转列表?我使用了这段代码并尝试了Collections.reverseOrder(),但这对Collections.reverse(list)不起作用@Jeremy是的,你是对的,我面临着同样的问题,所有空值数据首先出现,值数据最后出现。@Jeremy我得到了解决方案,只需交换-1和1的值。它工作正常,空值数据将出现在底部。
    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)
    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)
datas.sort(comparing(Data::getAttr1, naturalOrder()).
        thenComparing(Data::getAttr2, nullsLast(reverseOrder())));