Bean A(id, createTime, b) 包含 Bean B,需對 Set<A> 按 createTime 或 B 的字段排序。
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);
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<A> list = new ArrayList<>(originalSet);
list.sort(Comparator.comparing(A::getCreateTime));
Set<A> sortedSet = new LinkedHashSet<>(list);
compare(x,y)==0 視為同一元素,**會導致不同對象被去重**!必須在比較器中加入唯一標識(如 id)作為 tie-breaker。| 需求 | 推薦 |
|---|---|
| 單一固定順序,元素唯一 | TreeSet + Comparable |
| 多種順序動態切換 | TreeSet + Comparator / List.sort + LinkedHashSet |
| 僅需一次性有序遍歷 | List.sort + forEach |
掌握「比較器一致性」與「去重副作用」,是正確使用有序集合的關鍵。