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

Java List 排序:自定義對象實現 Comparable 接口或使用 Comparator 實現權重排序

     編輯:程式設計綜合問答

場景

自定義類 LinkType { String str; int weight; },List<LinkType> list 需按 weight 升序/降序排序。

方案一:實現 Comparable 接口(內部比較邏輯,適用於默認自然排序)

public class LinkType implements Comparable<LinkType> {
    private String str;
    private int weight;
    // 構造器、getter/setter...

    @Override
    public int compareTo(LinkType other) {
        // 升序:this.weight - other.weight
        // 降序:other.weight - this.weight
        return Integer.compare(this.weight, other.weight); // 防止溢出
    }
}

// 使用
Collections.sort(list); // 默認升序
// 降序
Collections.sort(list);
Collections.reverse(list);
// 或 Java 8+
list.sort(Comparator.naturalOrder()); // 升序
list.sort(Comparator.reverseOrder()); // 降序

方案二:使用 Comparator(外部比較邏輯,靈活、不修改實體類、支持多種排序策略)

// 1. 匿名內部類 / Lambda (Java 8+)
list.sort((a, b) -> Integer.compare(a.getWeight(), b.getWeight())); // 升序
list.sort((a, b) -> Integer.compare(b.getWeight(), a.getWeight())); // 降序

// 2. 靜態 Comparator 字段(復用)
public class LinkType {
    public static final Comparator<LinkType> BY_WEIGHT_ASC = Comparator.comparingInt(LinkType::getWeight);
    public static final Comparator<LinkType> BY_WEIGHT_DESC = BY_WEIGHT_ASC.reversed();
}
// 使用
list.sort(LinkType.BY_WEIGHT_ASC);

方案三:手寫排序算法(教學/特殊環境無庫支持時)

冒泡、快排等,直接在循環中調用 a.getWeight() > b.getWeight() 比較並交換列表元素。生產環境強烈不推薦,JDK Collections.sort/List.sort 使用 TimSort (O(n log n)),穩定、高性能、經過充分測試。

關鍵建議

  1. 優先方案二:Comparator.comparingInt 代碼最簡潔、無副作用、支持鏈式組合(如 .thenComparing(LinkType::getStr))。
  2. 實體類實現 Comparable 時,務必保證 compareTo 與 equals 一致(即 compareTo==0 <=> equals==true),否則在 TreeSet/TreeMap 中會出現邏輯錯誤。
  3. 對於基本類型權重,使用 Integer.compare 避免 a - b 溢出。
  4. 若排序頻繁且列表大,考慮維護有序數據結構(TreeSet、PriorityQueue)而非反覆排序。

Java 提供了豐富的排序 API,善用 Comparator 和 Lambda 表達式,即可用幾行代碼實現複雜的多字段、升降序組合排序,無需手寫算法。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved