自定義類 LinkType { String str; int weight; },List<LinkType> list 需按 weight 升序/降序排序。
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()); // 降序
// 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)),穩定、高性能、經過充分測試。
Comparator.comparingInt 代碼最簡潔、無副作用、支持鏈式組合(如 .thenComparing(LinkType::getStr))。Comparable 時,務必保證 compareTo 與 equals 一致(即 compareTo==0 <=> equals==true),否則在 TreeSet/TreeMap 中會出現邏輯錯誤。Integer.compare 避免 a - b 溢出。TreeSet、PriorityQueue)而非反覆排序。Java 提供了豐富的排序 API,善用 Comparator 和 Lambda 表達式,即可用幾行代碼實現複雜的多字段、升降序組合排序,無需手寫算法。