使用Java集合排序时如何处理空值
在Java中使用Collection.sort时,当其中一个内部对象为null时,我应该返回什么 例如:使用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(列表,新比较器(){ 公
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())));