java用类模拟结构体,arrays.sort通过comparator实现多维权重排序:先按分数降序,再按年龄升序,最后按姓名字典序,支持null安全处理和静态复用。

Java中没有“结构体”概念,但可以用类(class)模拟;Arrays.sort支持按多维权重排序,核心是提供自定义比较逻辑——通常通过实现Comparator完成。
定义可比较的自定义类
先创建一个类(如Student),包含多个字段(如成绩、年龄、姓名),这些字段将作为多维权重依据:
class Student {
String name;
int score;
int age;
Student(String name, int score, int age) {
this.name = name;
this.score = score;
this.age = age;
}
}
注意:字段不需要实现Comparable,排序逻辑由外部Comparator统一控制。
按多维权重顺序编写Comparator
权重顺序即优先级:比如“先按分数降序,分数相同时按年龄升序,再相同时按姓名字典序”。用Comparator.comparing链式调用实现:
- 用
Comparator.comparing(Student::getScore).reversed()实现分数降序 - 接着
.thenComparing(Student::getAge)实现年龄升序 - 再接
.thenComparing(Student::getName)实现姓名升序
完整示例:
Arrays.sort(students, Comparator.comparing((Student s) -> s.score).reversed()
.thenComparing(s -> s.age)
.thenComparing(s -> s.name));
封装成复用的静态比较器
避免每次重复写链式表达式,可定义静态方法或常量:
public static final Comparator<student> MULTI_WEIGHT_COMPARATOR =
Comparator.comparing((Student s) -> s.score).reversed()
.thenComparing(s -> s.age)
.thenComparing(s -> s.name);
// 使用
Arrays.sort(students, MULTI_WEIGHT_COMPARATOR);</student>
这样既清晰又便于维护和单元测试。
处理null值与基本类型包装
若字段可能为null(如String name),直接调用s.name会空指针。改用Comparator.nullsLast或nullsFirst安全包裹:
thenComparing(Comparator.nullsLast(String::compareTo))- 对
Integer等包装类型同理,避免自动拆箱异常
例如:.thenComparing(Comparator.nullsLast(Comparator.naturalOrder()))适配Integer字段。
不复杂但容易忽略细节:权重顺序靠链式调用决定,每级thenComparing只在前一级相等时生效;降序用reversed(),别误写成负号运算。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











