Java 1.6如何从子类集合中获取无重复的父类列表?
解决父类列表重复问题的核心方案
嘿,我一眼就看出问题所在啦!你遇到的重复添加父类的问题,核心原因是你的ParentClass没有正确重写equals()和hashCode()方法。
为什么会出现重复?
Java中ArrayList的contains()、indexOf()方法,还有HashSet的去重逻辑,默认都是基于对象的引用地址来判断相等性的(也就是Object类自带的equals()逻辑)。你每次通过parentClassDaoImpl.findParent()查询出来的ParentClass对象,哪怕对应数据库里的同一条父类数据,都是堆内存里的新实例——它们的引用地址不一样,所以contains()会错误地认为这是不同的对象,导致重复添加到列表中。
第一步:给ParentClass重写equals()和hashCode()
我们需要根据父类的唯一标识(比如id字段)来定义“相等”的规则,这样只要两个ParentClass对象的id相同,就会被判定为同一个对象。示例代码如下:
public class ParentClass { private Long id; // 其他属性、getter、setter方法 @Override public boolean equals(Object o) { // 先判断是否是同一个引用 if (this == o) return true; // 判断是否为null或者类型不匹配 if (o == null || getClass() != o.getClass()) return false; // 强制转换后比较唯一标识 ParentClass that = (ParentClass) o; return id != null ? id.equals(that.id) : that.id == null; } @Override public int hashCode() { // 基于id生成哈希值,保证相等的对象哈希值一致 return id != null ? id.hashCode() : 0; } }
第二步:优化你的去重代码(可选但更优雅)
重写方法后,你原来的contains()判断逻辑就能正常工作了。不过更推荐用Set来处理去重场景,因为Set本身就不允许重复元素,不需要手动判断:
// 用HashSet自动去重 Set<ParentClass> parentsSet = new HashSet<ParentClass>(); // 把DAO实例提到循环外,避免重复创建对象 ParentClassDaoImpl parentDao = new ParentClassDaoImpl(); for(ChildClass child : childs){ ParentClass parent = parentDao.findParent(child.getParentId()); parentsSet.add(parent); // Set会自动过滤重复对象 } // 如果最终需要List类型,直接转换即可 List<ParentClass> parents = new ArrayList<ParentClass>(parentsSet);
额外建议:一步完成去重+统计子类数量
既然你的最终目的是统计每个父类对应的子类总数,其实可以用Map直接一步到位,不需要先去重再统计:
Map<ParentClass, Integer> parentChildCountMap = new HashMap<ParentClass, Integer>(); ParentClassDaoImpl parentDao = new ParentClassDaoImpl(); for(ChildClass child : childs){ ParentClass parent = parentDao.findParent(child.getParentId()); // 更新统计数量 parentChildCountMap.put(parent, parentChildCountMap.getOrDefault(parent, 0) + 1); } // 遍历Map查看结果 for(Map.Entry<ParentClass, Integer> entry : parentChildCountMap.entrySet()){ System.out.println("父类:" + entry.getKey() + ",对应的子类总数:" + entry.getValue()); }
这个方法只需要遍历一次子类列表,同时完成去重和统计,效率更高。
内容的提问来源于stack exchange,提问作者Anirudh Lou
相关产品推荐
相关产品推荐

