Java 提供了兩種比較器機制:Comparable 接口與 Comparator 接口。它們在對象數組排序時扮演關鍵角色,但適用場景與設計哲學截然不同。
讓需要排序的類實現 Comparable<T> 接口,重寫 compareTo(T o) 方法定義「自然順序」,即可直接使用 Arrays.sort() 或 Collections.sort()。
class Student implements Comparable<Student> {
private String name;
private int age;
private float score;
public Student(String name, int age, float score) {
this.name = name;
this.age = age;
this.score = score;
}
@Override
public int compareTo(Student o) {
// 按分數降序,分數相同時按年齡升序
if (this.score > o.score) return -1;
if (this.score < o.score) return 1;
if (this.age > o.age) return 1;
if (this.age < o.age) return -1;
return 0;
}
@Override
public String toString() {
return name + "\t" + age + "\t" + score;
}
}
// 測試
Student[] students = {
new Student("zhangsan", 20, 90.0f),
new Student("lisi", 22, 90.0f),
new Student("wangwu", 20, 99.0f),
new Student("sunliu", 22, 100.0f)
};
Arrays.sort(students);
// 輸出:sunliu(100) > wangwu(99) > zhangsan(20,90) > lisi(22,90)
compareTo 只有一個參數 o,隱含 this 為另一比較對象private 字段(如 o.score),因為同類實例互享私有成員當無法修改目標類(如第三方庫類)或需要多種排序策略時,使用 Comparator<T>。其核心方法 compare(T o1, T o2) 接收兩個顯式參數,完全解耦。
class Student { // 不實現 Comparable
private String name;
private int age;
private float score;
// 構造器、getter/setter、toString 省略
}
class StudentComparator implements Comparator<Student> {
@Override
public int compare(Student o1, Student o2) {
if (o1.getScore() > o2.getScore()) return -1;
if (o1.getScore() < o2.getScore()) return 1;
if (o1.getAge() > o2.getAge()) return 1;
if (o1.getAge() < o2.getAge()) return -1;
return 0;
}
}
// 測試
Student[] students = { ... };
Arrays.sort(students, new StudentComparator());
| 維度 | Comparable | Comparator |
|---|---|---|
| 方法簽名 | compareTo(T o) | compare(T o1, T o2) |
| 參數個數 | 1 個(隱含 this) | 2 個顯式參數 |
| 耦合度 | 高(侵入式修改類) | 低(外部策略類) |
| 適用場景 | 單一自然順序,可控制源碼 | 多種排序策略、不可修改類 |
| 排序調用 | Arrays.sort(arr) | Arrays.sort(arr, comparator) |
// 降序按分數,再升序按年齡
Arrays.sort(students, Comparator
.comparing(Student::getScore).reversed()
.thenComparing(Student::getAge));
Comparable 定義對象的「天然順序」,適合作為默認排序;Comparator 實現「策略模式」,提供靈活的外部排序邏輯。實際開發中,建議核心領域模型實現 Comparable,輔以多個 Comparator 滿足不同業務場景。