Java 集合排序是基礎且高頻的操作。本文通過完整示例展示如何使用 Comparator 介面定制複雜排序邏輯,結合 Collections.sort 實現對象列表的多字段排序(先按名稱升序,名稱相同再按年齡升序)。
標準 JavaBean,包含 userName (String) 和 userAge (int) 兩個屬性,提供無參/全參構造器與 Getter/Setter。
public class User {
private String userName;
private int userAge;
public User() {}
public User(String userName, int userAge) {
this.userName = userName;
this.userAge = userAge;
}
// Getter/Setter 省略...
}
實現 Comparator<User> 介面,compare 方法返回負數/零/正數分別表示小於/等於/大於。邏輯:先比較 userName (字符串自然順序),相等時比較 userAge (整數差值)。
public class ComparatorUser implements Comparator<User> {
@Override
public int compare(User u1, User u2) {
// 先按名稱比較
int nameCompare = u1.getUserName().compareTo(u2.getUserName());
// 名稱相同則按年齡比較
if (nameCompare == 0) {
return u1.getUserAge() - u2.getUserAge();
}
return nameCompare;
}
}
構建包含重複名稱、不同年齡的測試數據,調用 Collections.sort(list, comparator) 排序,遍歷輸出驗證結果。
public class TestApp {
public static void main(String[] args) {
List<User> userList = new ArrayList<User>();
// 插入測試數據
userList.add(new User("A", 15));
userList.add(new User("B", 14));
userList.add(new User("A", 14));
// 排序
Collections.sort(userList, new ComparatorUser());
// 輸出結果
for (User u : userList) {
System.out.println(u.getUserName() + " " + u.getUserAge());
}
}
}
A 14
A 15
B 14
| API | 簽名 | 說明 |
|---|---|---|
| Collections.sort | <T> void sort(List<T> list, Comparator<? super T> c) | 使用指定比較器對列表進行穩定排序 (TimSort 算法) |
| Comparator.compare | int compare(T o1, T o2) | 返回負/零/正表示 o1 小於/等於/大於 o2 |
| String.compareTo | int compareTo(String anotherString) | 字典序比較,基於 Unicode 值 |
使用 Lambda 表達式與 Comparator 鏈式調用,代碼更簡潔:
// Java 8+ 風格
userList.sort(Comparator
.comparing(User::getUserName)
.thenComparingInt(User::getUserAge));
// 或使用靜態導入
import static java.util.Comparator.*;
userList.sort(comparing(User::getUserName).thenComparingInt(User::getUserAge));