java如何分级排序
在Java中实现分级排序
分级排序通常指按照多个条件或属性对数据进行排序。Java中可以通过Comparator接口或Comparable接口实现多级排序。
使用Comparator实现多级排序
通过链式调用Comparator的thenComparing方法,可以依次指定多个排序条件:
List<Person> people = Arrays.asList(
new Person("Alice", 25, 80),
new Person("Bob", 30, 90),
new Person("Alice", 25, 85)
);
// 按姓名升序,年龄降序,分数升序排序
people.sort(Comparator.comparing(Person::getName)
.thenComparing(Person::getAge, Comparator.reverseOrder())
.thenComparing(Person::getScore));
System.out.println(people);
实现Comparable接口
在类中实现Comparable接口,重写compareTo方法定义排序逻辑:
class Person implements Comparable<Person> {
private String name;
private int age;
private int score;
@Override
public int compareTo(Person other) {
int nameCompare = this.name.compareTo(other.name);
if (nameCompare != 0) return nameCompare;
int ageCompare = Integer.compare(other.age, this.age); // 年龄降序
if (ageCompare != 0) return ageCompare;
return Integer.compare(this.score, other.score);
}
}
使用Stream API排序
Java 8的Stream API也支持多级排序:
List<Person> sorted = people.stream()
.sorted(Comparator.comparing(Person::getName)
.thenComparing(Person::getAge).reversed()
.thenComparing(Person::getScore))
.collect(Collectors.toList());
自定义Comparator
对于复杂排序逻辑,可以编写自定义Comparator:
Comparator<Person> customComparator = (p1, p2) -> {
if (!p1.getName().equals(p2.getName())) {
return p1.getName().compareTo(p2.getName());
}
if (p1.getAge() != p2.getAge()) {
return p2.getAge() - p1.getAge(); // 年龄降序
}
return p1.getScore() - p2.getScore();
};
处理null值
排序时可能需要处理null值,可以使用Comparator.nullsFirst或Comparator.nullsLast:

Comparator<Person> nullSafeComparator = Comparator.comparing(
Person::getName,
Comparator.nullsFirst(Comparator.naturalOrder())
);
这些方法提供了灵活的方式来实现Java中的分级排序需求。






