You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 20:56:05