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

Set集合对相同值对象判定为不同,SQLite应用去重失效求助

解决HashSet无法对NewTableAnswers对象去重的问题

嘿,这个问题我太熟了!你遇到的核心问题是:HashSet默认是通过对象的内存地址来判断是否重复的,而不是根据对象的字段值。哪怕两个NewTableAnswers实例的所有字段都完全一样,只要它们是不同的对象(通过new创建的不同实例),HashSet就会把它们当成不同的元素存入集合,自然达不到去重的效果。

为什么会这样?

HashSet的去重逻辑依赖两个核心方法,而默认的实现不满足你的需求:

  • hashCode():默认返回与对象内存地址相关的数值,不同实例的哈希值大概率不同
  • equals():默认比较两个对象的内存地址,只有同一个实例才会返回true

所以只要是通过new创建的不同NewTableAnswers实例,哪怕字段值完全一致,HashSet都会把它们当成不同元素。

解决方法:重写NewTableAnswers的equals()和hashCode()方法

你需要根据自己的业务逻辑,定义“什么情况下两个NewTableAnswers对象是重复的”(比如基于数据库表的主键,或者几个关键字段的组合),然后重写这两个方法。

举个例子,假设你认为只要answerId和productId这两个字段的值相同,就属于重复对象,那么可以这样重写:

import java.util.Objects;

public class NewTableAnswers {
    // 假设你的类包含这些核心字段
    private String answerId;
    private String productId;
    // 其他业务字段...

    // 重写equals方法,基于核心字段判断对象是否相等
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        NewTableAnswers that = (NewTableAnswers) o;
        return Objects.equals(answerId, that.answerId) &&
               Objects.equals(productId, that.productId);
    }

    // 重写hashCode方法,与equals逻辑保持一致
    @Override
    public int hashCode() {
        return Objects.hash(answerId, productId);
    }

    // 你的getter、setter及其他业务方法...
}

额外建议:数据库层面直接去重(可选)

其实你也可以在SQL查询阶段就完成去重,这样能减少内存中处理的数据量,效率更高。比如使用DISTINCT关键字:

SELECT DISTINCT * FROM " + TABLE_ANSWERS + " WHERE " + ANSWER_ID + " = '" + product_id + "' ";

不过要注意,DISTINCT是基于整行数据的,如果两行数据有任何一个字段不同,就不会被去重。如果只需要基于特定字段去重,可以结合GROUP BY:

SELECT * FROM " + TABLE_ANSWERS + " WHERE " + ANSWER_ID + " = '" + product_id + "' GROUP BY answer_id, product_id;

这样修改后,HashSet就能正确识别重复的NewTableAnswers对象,完成去重啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:14:11