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

