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

Java Comparator 比較器完整指南:多條件排序、Lambda 寫法與避坑指南

     編輯:Java 程式設計入門

核心介面

@FunctionalInterface
public interface Comparator {
    int compare(T o1, T o2); // 負數:o1o2
}

實體類 Student

class Student {
    private String name; private int age;
    // 建構子、getter/setter、toString 略
}

傳統匿名類別寫法

Collections.sort(list, new Comparator() {
    @Override public int compare(Student s1, Student s2) {
        int nameCmp = s1.getName().compareTo(s2.getName());
        if (nameCmp != 0) return nameCmp; // 主鍵:姓名
        return s1.getAge() - s2.getAge(); // 次鍵:年齡
    }
});

Java 8+ Lambda 簡潔寫法

// 靜態導入:import static java.util.Comparator.*;
list.sort(comparing(Student::getName)
            .thenComparingInt(Student::getAge));

鏈式方法:

  • comparing(Function):主鍵
  • thenComparing(Function):次鍵(支援 Comparator)
  • thenComparingInt/Long/Double:基本型別避免裝箱
  • reversed():倒序
  • nullsFirst/Last():空值處理

完整測試類別

public class ComparatorDemo {
    public static void main(String[] args) {
        List list = Arrays.asList(
            new Student("abc", 10), new Student("bdc", 10),
            new Student("bdd", 5),  new Student("aad", 30)
        );

        // 姓名升序,同年齡升序
        list.sort(comparing(Student::getName).thenComparingInt(Student::getAge));
        list.forEach(s -> System.out.println(s.getAge() + ":" + s.getName()));
    }
}

輸出:

30:aad
10:abc
10:bdc
5:bdd

常見錯誤與最佳實踐

錯誤後果正確做法
減法溢位 a - b大數相減可能溢位導致排序錯誤用 Integer.compare(a,b) 或 thenComparingInt
違反傳遞性sort 拋 IllegalArgumentException確保 compare(a,b) 與 equals 一致
修改排序中元素行為未定義排序前完成所有修改
忽略 nullNPEnullsFirst() 或預設值

進階:自定義比較器類別(可復用)

public class StudentComparator implements Comparator {
    @Override public int compare(Student s1, Student s2) {
        int c = s1.getName().compareTo(s2.getName());
        return c != 0 ? c : Integer.compare(s1.getAge(), s2.getAge());
    }
}
// 使用
list.sort(new StudentComparator());

總結:選擇指南

  • 一次性邏輯 → Lambda comparing/thenComparing
  • 多處復用/單元測試 → 獨立 Comparator 實作類
  • 基本型別欄位 → thenComparingInt/Long/Double
  • 需序列化/遠程傳遞 → 實作 Serializable 的具名類
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved