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

Java Set 集合排序:TreeSet 與 Comparator 實戰指南

     編輯:程式設計疑難解答

場景

Bean A(id, createTime, b) 包含 Bean B,需對 Set<A> 按 createTime 或 B 的字段排序。

方案一:TreeSet + 實現 Comparable(自然順序)

public class A implements Comparable<A> {
    private Long id;
    private Date createTime;
    private B b;
    // getter/setter
    @Override
    public int compareTo(A o) {
        return this.createTime.compareTo(o.createTime); // 升序
    }
}

// 使用
Set<A> sortedSet = new TreeSet<>(originalSet);

方案二:TreeSet + Comparator(外部定制順序)

Set<A> sortedSet = new TreeSet<>((a1, a2) -> {
    // 先按 createTime,再按 id 防止相等元素被去重
    int cmp = a1.getCreateTime().compareTo(a2.getCreateTime());
    return cmp != 0 ? cmp : a1.getId().compareTo(a2.getId());
});
sortedSet.addAll(originalSet);

方案三:List 排序後轉 LinkedHashSet(保留插入順序)

List<A> list = new ArrayList<>(originalSet);
list.sort(Comparator.comparing(A::getCreateTime));
Set<A> sortedSet = new LinkedHashSet<>(list);

關鍵注意點

  • TreeSet 依賴比較器一致性: compare(x,y)==0 視為同一元素,**會導致不同對象被去重**!必須在比較器中加入唯一標識(如 id)作為 tie-breaker。
  • HashSet/LinkedHashSet 無序/插入序,不支持直接排序。
  • Bean 需正確實現 equals/hashCode, 否則 Set 去重邏輯失效。

推薦選型

需求推薦
單一固定順序,元素唯一TreeSet + Comparable
多種順序動態切換TreeSet + Comparator / List.sort + LinkedHashSet
僅需一次性有序遍歷List.sort + forEach

掌握「比較器一致性」與「去重副作用」,是正確使用有序集合的關鍵。

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