问题描述:
需要对实体类中的两个字段进行排序, 先判断年龄, 如果年龄相等, 再判断姓名;
而通过 collections 类的 sort 方法对 ArrayList 进行排序发现没有生效,也没有报错。
原因分析:
发现是由于当前项目使用的是 JDK 1.7 版本, Comparator 返回值必须是一对相反数,如 1 和 -1,因为 JDK 1.7 的排序算法采用 timsort,对返回值有严格要求;
而在 JDK 8 中, 返回值可以是 0、正数或负数;
解决方案:
Collections.sort(personList, new Comparator<Person>() {
@Override
publicintcompare(Person p1, Person p2) {
if (p1.age > p2.age) {
return 1;
} else if (p1.age < p2.age) {
// JDK 1.7 中必须返回 -1,而不是 0
return -1;
} else {
// 年龄相等时,调用String中的compareTo()方法比较姓名
return p1.name.compareTo(p2.name);
}
}
});