Java HashMap无法存储重复值问题:实现单Key对应多条Bug记录
问题根因
- 原代码中
Assigned定义为Map<String, Bug>类型,HashMap的键具备唯一性,调用put方法传入已存在的键时,新值会直接覆盖旧值,因此给同一个开发分配多个Bug时,只会保留最后一次分配的记录。 - 全局静态的
getAssigned集合是全局共用的,多次调用getAssignedTo方法会累加所有查询过的开发的Bug,无法实现按指定开发单独查询的需求。 - 原
toString方法的输出格式和需求预期不符。
修复方案
- 将
Assigned的类型修改为Map<String, Set<Bug>>,每个开发姓名对应的Value是一个Bug集合,支持存储同一名开发名下的多个Bug。 - 调整
assignTo方法逻辑:插入前先判断当前开发对应的集合是否存在,不存在则先初始化集合,再将当前Bug加入集合,避免覆盖旧数据。 - 调整
getAssignedTo方法逻辑:直接返回对应开发的Bug集合,删除全局共用的getAssigned集合,避免不同查询的数据互相干扰。 - 修正
toString方法的输出格式,匹配预期输出要求。
完整修改后代码
import java.util.*; public class Bug { private String Errore; private String Dev; static Set<Bug> NotAssigned = new HashSet<>(); // 修改Map的Value类型为Set<Bug>,存储同个开发名下的所有Bug static Map<String, Set<Bug>> Assigned = new HashMap<>(); Bug(String DescrErrore){ Errore=DescrErrore; NotAssigned.add(this); } public static Set<Bug> getUnassigned(){ return NotAssigned; } public void assignTo(String Dev){ this.Dev=Dev; // 若当前开发没有对应的集合,先初始化 Assigned.computeIfAbsent(Dev, k -> new HashSet<>()).add(this); NotAssigned.remove(this); } public static Set<Bug> getAssignedTo(String Dev){ // 不存在则返回空集合,避免空指针 return Assigned.getOrDefault(Dev, Collections.emptySet()); } @Override public String toString() { return "(\"" + Errore + "\",assigned to " + Dev + ")"; } public static void main(String[] args) { Bug b1 = new Bug("Application crashes on Windows 8"), b2 = new Bug("Application freezes after 2 hours"), b3 = new Bug("Application does not print on laser printer"), b4 = new Bug("Data missing after partial save"); Set<Bug> unassigned = Bug.getUnassigned(); System.out.println(unassigned.size ()); b2.assignTo("Paolo"); b3.assignTo("Filomena"); b4.assignTo("Filomena"); System.out.println(unassigned.size()); Set<Bug> filo = Bug.getAssignedTo("Filomena"); System.out.println( filo ); } }
运行输出
4 1 [("Application does not print on laser printer",assigned to Filomena), ("Data missing after partial save",assigned to Filomena)]
注:HashSet是无序存储结构,输出的两个Bug顺序可能和示例有差异,若需要固定分配顺序,可将HashSet替换为LinkedHashSet。
内容的提问来源于stack exchange,提问作者Massimo Colucci
相关产品推荐
相关产品推荐

