Java getCommonPartners方法重复返回相同Suspect对象问题求助
问题说明
编写的getCommonPartners方法会被提供的Main类调用,预期返回结果仅包含1个Suspect对象,实际运行时会重复返回同一个对象约8次,临近提交截止需要定位修复问题,原方法实现如下:
public ArrayList<Suspect> getCommonPartners(Suspect aSuspect) { ArrayList<Suspect> commonpartners = new ArrayList<>() ; for(Suspect s: partners) { for(Suspect sus: aSuspect.getPartners()) { if(s.getCodename().equals(sus.getCodename())) { commonpartners.add(s); } } } return (commonpartners); }
问题根因
现有逻辑是双层遍历做完全匹配,存在两个问题导致重复添加对象:
- 匹配到共同伙伴后没有终止内层循环,只要传入嫌疑人的伙伴列表里存在多个和当前s codename相等的对象,就会多次触发add
- 没有对结果列表做去重判断,如果当前对象的
partners列表本身就存在多个同codename的重复伙伴条目,也会重复添加匹配到的对象
最终返回的是两个伙伴列表的多重集交集,而不是去重后的共同伙伴集合,才会出现同一个对象重复返回多次的情况。
修复代码
最小改动适配作业场景的修复版本如下,不需要额外引入其他数据结构:
public ArrayList<Suspect> getCommonPartners(Suspect aSuspect) { ArrayList<Suspect> commonpartners = new ArrayList<>(); for (Suspect s : partners) { // 先判断当前嫌疑人是否已经加入结果列表,避免重复添加 boolean exists = false; for (Suspect added : commonpartners) { if (added.getCodename().equals(s.getCodename())) { exists = true; break; } } if (exists) { continue; } // 遍历传入嫌疑人的伙伴列表找匹配 for (Suspect sus : aSuspect.getPartners()) { if (s.getCodename().equals(sus.getCodename())) { commonpartners.add(s); // 匹配到后直接跳出内层循环,不需要继续遍历剩余项 break; } } } return commonpartners; }
注:这里直接用codename判断重复,不需要给Suspect类额外重写equals方法,适配多数课程作业的代码基础。
内容的提问来源于stack exchange,提问作者Vasilis Tsonis
相关产品推荐
相关产品推荐

