业务需要同时做到去重、保留插入顺序和按规则排序,你会怎么选择 Set 的实现?
我的判断
去重、保留原顺序和按规则排序不是一个 Set 同时完成的三个开关,先明确最终输出语义,再组合最合适的数据结构。
如果要求“第一次出现的顺序保留,同时去重”,直接用 LinkedHashSet。如果最终只关心排序后的唯一结果,可以用带 Comparator 的 TreeSet,但要非常小心:Comparator 返回 0 就会被认为是同一个元素,它表达的是去重规则,不只是显示顺序。
运营常见需求其实是:按订单号去重,保留一条记录,然后按金额或时间展示。我不会用一个 TreeSet 硬做,而是先用明确业务键放进 LinkedHashMap<OrderKey, Order>,决定重复时保留第一条还是最后一条,再把 values 放进 List 排序。
Map<OrderKey, Order> unique = new LinkedHashMap<>();
orders.forEach(o -> unique.putIfAbsent(keyOf(o), o));
List<Order> result = new ArrayList<>(unique.values());
result.sort(orderComparator);
这样去重语义和排序语义分开,需求变化时不会互相影响。