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

为何我的HashMap出现重复数据?Java分组逻辑代码求助

问题分析与修复方案

问题根源

你代码里的核心错误是使用了全局共享的Males和Females列表——所有同性别人员(不管出生年份)都被塞进同一个列表,随后每次调用put时,都把这个全量列表绑定到不同的出生年份键上。这就导致内层HashMap里所有年份对应的都是同一个列表,自然会出现所有年份都包含全部同性别Person的重复数据。

修复后的代码

public HashMap<Gender, HashMap<Integer, ArrayList<Person>>> personsByGenderAndYearOfBirth() {
    HashMap<Gender, HashMap<Integer, ArrayList<Person>>> result = new HashMap<>();

    // 处理所有Customer
    for (Customer customer : allCustomers.values()) {
        processPerson(customer, result);
    }
    // 处理所有Employee
    for (Employee employee : allEmployees.values()) {
        processPerson(employee, result);
    }

    System.out.println(result.get(Gender.M));
    System.out.println(result);
    return result;
}

// 公共处理逻辑,避免代码冗余
private void processPerson(Person person, HashMap<Gender, HashMap<Integer, ArrayList<Person>>> result) {
    Gender gender = person.getGender();
    int birthYear = person.getYearOfBirth();

    // 按性别获取年份->人员列表的Map,不存在则创建
    HashMap<Integer, ArrayList<Person>> yearMap = result.computeIfAbsent(gender, k -> new HashMap<>());
    // 按出生年份获取人员列表,不存在则创建
    ArrayList<Person> personList = yearMap.computeIfAbsent(birthYear, k -> new ArrayList<>());
    // 将当前人员加入对应列表
    personList.add(person);
}

修复逻辑说明

  • 取消全局共享列表,改为每个性别+年份的组合维护独立的人员列表,从根源避免数据重复
  • 使用computeIfAbsent方法简化“不存在则创建新容器”的逻辑,替代手动判断,代码更简洁健壮
  • 抽取出公共的processPerson方法,合并Customer和Employee的处理逻辑,减少冗余代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 14:05:17