首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 列表排序實戰:Comparator 定制比較與 Collections.sort 完整指南

     編輯:Java 相關知識

前言

Java 集合排序是基礎且高頻的操作。本文通過完整示例展示如何使用 Comparator 介面定制複雜排序邏輯,結合 Collections.sort 實現對象列表的多字段排序(先按名稱升序,名稱相同再按年齡升序)。

領域模型:User 類

標準 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 省略...
}

比較器實現:ComparatorUser

實現 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;
    }
}

測試驗證:TestApp

構建包含重複名稱、不同年齡的測試數據,調用 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 解析

API簽名說明
Collections.sort<T> void sort(List<T> list, Comparator<? super T> c)使用指定比較器對列表進行穩定排序 (TimSort 算法)
Comparator.compareint compare(T o1, T o2)返回負/零/正表示 o1 小於/等於/大於 o2
String.compareToint compareTo(String anotherString)字典序比較,基於 Unicode 值

Java 8+ 現代寫法優化

使用 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));

進階排序場景擴展

  • 降序排序:comparing(User::getUserName).reversed()
  • 空值處理:nullsFirst() / nullsLast() 組合
  • 多字段混合排序:thenComparing() 鏈式調用無限擴展
  • 自定義比較邏輯:thenComparing((u1, u2) -> 自定義邏輯)
  • 並行排序:大數據量可用 list.parallelSort() (Java 8+)

常見陷阱與最佳實踐

  1. 比較器一致性:compare(a,b) 與 compare(b,a) 符號必須相反,違反會導致排序異常或拋出 IllegalArgumentException
  2. 避免減法溢出:整數比較優先使用 Integer.compare(a,b) 而非 a-b,防止溢出導致邏輯錯誤
  3. 不可變性:比較器不應依賴可變狀態,保證線程安全
  4. 穩定排序:Collections.sort 保證穩定性,相等元素相對位置不變
  5. 性能考量:比較器邏輯應輕量,避免複雜計算、I/O、數據庫查詢
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved