我想对对象的数组列表进行排序,其中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);
}
}
});
Run Code Online (Sandbox Code Playgroud)
从Java 8开始,此功能已存在于库中的Comparator.nullsLast:
Collections.sort(coll, Comparator.nullsLast(new YourComparator()));
Run Code Online (Sandbox Code Playgroud)
您当前的比较器将正常工作,Comparator.nullsLast将处理null元素并使它们最后运行。
如果你需要使用Java 7,您可以确保null通过合适的返回值的值,我们就到年底排序compare依据的空两者均o1和o2:
o1和o2都返回0nullo1是null和o2不是,则返回1o1不是null,o2则返回-1完整的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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我还纠正了您帖子中的方法签名。
您可以像这样使用此比较器:
Collections.sort(users, new UserComparator());
Run Code Online (Sandbox Code Playgroud)
如果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);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1186 次 |
| 最近记录: |