如何实现SortableRecord集合按独立参数排序并按ID去重?
解决方案
要满足需求,我们需要让SortableRecord类既实现按ID去重、保留每个ID的最大value,又能让集合按指定顺序排序。具体实现如下:
1. 定义SortableRecord类
该类需要实现Comparable接口来指定排序规则,同时重写equals和hashCode保证ID作为唯一性判定依据:
public class SortableRecord implements Comparable<SortableRecord> { private final String id; private final double value; public SortableRecord(String id, double value) { this.id = id; this.value = value; } public String getId() { return id; } public double getValue() { return value; } // 按ID判断相等性 @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; SortableRecord that = (SortableRecord) o; return id.equals(that.id); } @Override public int hashCode() { return id.hashCode(); } // 按ID逆序排序,确保"b"排在"a"前面 @Override public int compareTo(SortableRecord other) { return other.id.compareTo(this.id); } @Override public String toString() { return String.format("SortableRecord{id='%s', value=%.1f}", id, value); } }
2. 自定义集合添加逻辑
由于TreeSet仅通过compareTo结果判断元素是否重复(返回0则视为重复,不会替换旧元素),因此我们需要手动处理添加流程,确保每个ID保留value最大的实例:
import java.util.TreeSet; public class RecordSetDemo { public static void main(String[] args) { TreeSet<SortableRecord> recordSet = new TreeSet<>(); // 逐个添加元素并处理去重和保留最大值 addOrUpdateRecord(recordSet, new SortableRecord("a", 10.0)); addOrUpdateRecord(recordSet, new SortableRecord("a", 11.0)); addOrUpdateRecord(recordSet, new SortableRecord("a", 300.0)); addOrUpdateRecord(recordSet, new SortableRecord("b", 11.0)); addOrUpdateRecord(recordSet, new SortableRecord("b", 41.0)); // 验证结果 System.out.println("集合大小:" + recordSet.size()); // 输出:2 recordSet.forEach(System.out::println); // 输出顺序: // SortableRecord{id='b', value=41.0} // SortableRecord{id='a', value=300.0} } private static void addOrUpdateRecord(TreeSet<SortableRecord> set, SortableRecord newRecord) { // 查找集合中同ID的元素 SortableRecord existing = set.stream() .filter(r -> r.getId().equals(newRecord.getId())) .findFirst() .orElse(null); if (existing != null) { // 新元素value更大则替换旧元素 if (newRecord.getValue() > existing.getValue()) { set.remove(existing); set.add(newRecord); } } else { set.add(newRecord); } } }
关键说明
- 去重逻辑:通过
equals和hashCode基于ID实现,确保同ID元素被视为同一对象。 - 排序逻辑:
compareTo方法按ID逆序比较,让"b"自然排在"a"前面,符合需求。 - 保留最大value:自定义
addOrUpdateRecord方法,添加前检查同ID元素,仅当新元素value更大时才替换旧元素,保证每个ID保留最大值实例。
内容的提问来源于stack exchange,提问作者Jason p
相关产品推荐
相关产品推荐

