首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Collections.sort 比較器邏輯詳解:將 isRecommend=true 的對象排在前面

     編輯:程式設計疑難解答

問題代碼分析

Collections.sort(list, new Comparator<AppEntity>() {
    @Override
    public int compare(AppEntity lhs, AppEntity rhs) {
        if (rhs.isRecommend != lhs.isRecommend) {
            return 0; // 💥 錯誤:返回 0 表示「相等」,排序算法視為無序
        }
        return -1;  // 💥 錯誤:固定返回 -1 導致排序不穩定、邏輯錯誤
    }
});

Comparator 契約核心

compare(a, b) 返回值語義:

  • 負數:a 排在 b **前面** (a < b)
  • 零:a 和 b **相等** (a == b)
  • 正數:a 排在 b **後面** (a > b)

正確實現

方案一:布爾值直接比較(推薦,簡潔)

Collections.sort(list, (a, b) -> {
    // true > false,所以 b 是 true 時返回正數(b 前),a 是 true 時返回負數(a 前)
    return Boolean.compare(b.isRecommend, a.isRecommend);
});

方案二:显式 if-else(易讀)

Collections.sort(list, new Comparator<AppEntity>() {
    @Override
    public int compare(AppEntity a, AppEntity b) {
        if (a.isRecommend && !b.isRecommend) {
            return -1; // a 推薦,b 不推薦 → a 前
        } else if (!a.isRecommend && b.isRecommend) {
            return 1;  // a 不推薦,b 推薦 → b 前
        } else {
            return 0;  // 同樣推薦狀態 → 保持相對順序(穩定排序)
        }
    }
});

方案三:Comparator.comparing + 反轉(Java 8+ 函數式)

list.sort(Comparator.comparing(AppEntity::isRecommend).reversed());
// isRecommend 為 true 的排在前面

原代碼為什麼錯?

場景原代碼返回排序器理解結果
a=true, b=false0a == b順序不確定,可能不交換
a=false, b=true0a == b順序不確定
a=true, b=true-1a < ba 排前,但邏輯混亂
a=false, b=false-1a < ba 排前,違反穩定性

最佳實踐總結

  1. **永遠不要固定返回 -1/0/1** 忽略參數
  2. **利用 JDK 工具類**:Boolean.compare, Integer.compare, Comparator.comparing
  3. **保持穩定性**:相等時返回 0,不改變相對順序
  4. **單元測試**:驗證各種 true/false 組合的輸出順序
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved