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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.17 16:16:01