为何我的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
相关产品推荐
相关产品推荐

