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

HashSet存储自定义ElectricityReading类按time去重及有序存储优化方案

问题1:出现重复time条目的原因

你的判断逻辑存在错误:HashSet<ElectricityReading>中存储的是ElectricityReading实例,你调用reading.contains(electricityReading.getTime())时传入的是Instant类型对象,和集合中存储的元素类型完全不匹配,contains方法会永远返回false,相当于去重判断完全失效,所有生成的实例都会被加入集合,自然会出现time重复的条目。
另外你当前的else分支逻辑electricityReading.setReading(electricityReading.getReading());完全没有作用,相当于给自己赋值,没有任何业务意义。

修复该问题非常简单:你已经重写了ElectricityReading的equals和hashCode方法仅基于time判断,直接调用reading.add(electricityReading)即可,HashSet会自动完成去重,time重复的实例会被自动忽略,不需要额外写判断逻辑。


问题2:更优的实现方式

有两种更简洁的实现方案,可按需选择:

方案1:使用TreeSet直接实现去重+排序

TreeSet自带排序能力,且会根据排序规则判断元素是否重复,刚好匹配你的需求:

public List<ElectricityReading> generate(int number) {
    // 直接按time排序,同时time相同的元素会被判定为重复自动去重
    Set<ElectricityReading> readingSet = new TreeSet<>(Comparator.comparing(ElectricityReading::getTime));
    Instant now = Instant.now();
    Random readingRandomiser = new Random();
    for (int i = 0; i < number; i++) {
        double positiveRandomValue = Math.abs(readingRandomiser.nextGaussian());
        BigDecimal randomReading = BigDecimal.valueOf(positiveRandomValue).setScale(4, RoundingMode.CEILING);
        ElectricityReading electricityReading = new ElectricityReading(now.minusSeconds(i * 10), randomReading);
        readingSet.add(electricityReading);
    }
    // TreeSet本身已经按time升序排列,直接转List即可,不需要额外排序
    return new ArrayList<>(readingSet);
}

方案2:使用TreeMap实现重复time覆盖旧值

如果你需要重复time时覆盖旧的reading值,用TreeMap更合适,key为time,自动按key排序,重复key会自动覆盖旧值:

public List<ElectricityReading> generate(int number) {
    Map<Instant, ElectricityReading> readingMap = new TreeMap<>();
    Instant now = Instant.now();
    Random readingRandomiser = new Random();
    for (int i = 0; i < number; i++) {
        double positiveRandomValue = Math.abs(readingRandomiser.nextGaussian());
        BigDecimal randomReading = BigDecimal.valueOf(positiveRandomValue).setScale(4, RoundingMode.CEILING);
        Instant time = now.minusSeconds(i * 10);
        // 重复time会直接覆盖旧的实例
        readingMap.put(time, new ElectricityReading(time, randomReading));
    }
    // TreeMap的values已经按time升序排列,直接转List即可
    return new ArrayList<>(readingMap.values());
}

内容的提问来源于stack exchange,提问作者Shruti sharma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 20:18:03