我想对一个对象的数组列表进行排序,其中null或空对象必须最后到达ArrayList。这是我根据两个属性,名称和数量进行排序。
public int compare(Object o1, Object o2) {
String username1=((User) o1).getName();
String username2=((User) o2).getName();
int namecomp=username1.compareTo(username2);
if(namecomp!=0){
return namecomp;
}
else{
Integer useramount1= ((User) o1).getAmount();
Integer useramount2=((User) o2).getAmount();
return useramount1.compareTo(useramount2);
}
}
});
答案 0 :(得分:4)
从Java 8开始,此功能已存在于库中,Comparator.nullsLast
:
Collections.sort(coll, Comparator.nullsLast(new YourComparator()));
你现在的比较器会起作用,
Comparator.nullsLast
将处理null
个元素,并将它们放在最后。
如果您需要使用Java 7,则可以确保null
值在最后排序,方法是从compare
返回适当的值,具体取决于o1
的无效值和o2
:
o1
和o2
都是null
,则o1
为null
且o2
不是o1
不是null
且o2
完整的Comparator
类可以像这样实现:
static class UserComparator implements Comparator<User> {
@Override
public int compare(User o1, User o2) {
if (o1 == null) {
return (o2 == null) ? 0 : 1;
}
if (o2 == null) {
return -1;
}
String username1 = o1.getName();
String username2 = o2.getName();
int namecomp = username1.compareTo(username2);
if (namecomp != 0) {
return namecomp;
} else {
Integer useramount1 = o1.getAmount();
Integer useramount2 = o2.getAmount();
return useramount1.compareTo(useramount2);
}
}
}
我还更正了帖子中的方法签名。
你可以像这样使用这个比较器:
Collections.sort(users, new UserComparator());
如果username
和amount
字段都可以为空,
那么你也可以将相同的概念应用于那些:
static class UserComparator implements Comparator<User> {
@Override
public int compare(User o1, User o2) {
if (o1 == null) {
return (o2 == null) ? 0 : 1;
}
if (o2 == null) {
return -1;
}
String username1 = o1.getName();
String username2 = o2.getName();
if (username1 == null) {
return username2 == null ? 0 : 1;
}
if (username2 == null) {
return -1;
}
int namecomp = username1.compareTo(username2);
if (namecomp != 0) {
return namecomp;
}
Integer useramount1 = o1.getAmount();
Integer useramount2 = o2.getAmount();
if (useramount1 == null) {
return useramount2 == null ? 0 : 1;
}
if (useramount2 == null) {
return -1;
}
return useramount1.compareTo(useramount2);
}
}
答案 1 :(得分:0)
我正在使用Java 7
要获得更可重复使用的解决方案,您可以使用Bean Comparator和Group Comparator。
BeanComparator
允许您对对象中的任何属性进行排序,并允许您控制null的排序位置
GroupComparator
允许您将多个Comparator
合并为一个Comparator
。
所以基本逻辑是:
BeanComparator name = new BeanComparator(User.class, "getName");
BeanComparator amount = new BeanComparator(User.class, "getAmount");
GroupComparator gc = new GroupComparator(name, amount);