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
相关产品推荐
相关产品推荐

