You need to enable JavaScript to run this app. Java HashMap无法存储重复值问题:实现单Key对应多条Bug记录
优惠活动
大模型
产品
解决方案
定价
更多

Java HashMap无法存储重复值问题:实现单Key对应多条Bug记录

问题根因
  • 原代码中Assigned定义为Map<String, Bug>类型,HashMap的键具备唯一性,调用put方法传入已存在的键时,新值会直接覆盖旧值,因此给同一个开发分配多个Bug时,只会保留最后一次分配的记录。
  • 全局静态的getAssigned集合是全局共用的,多次调用getAssignedTo方法会累加所有查询过的开发的Bug,无法实现按指定开发单独查询的需求。
  • 原toString方法的输出格式和需求预期不符。
修复方案
  1. 将Assigned的类型修改为Map<String, Set<Bug>>,每个开发姓名对应的Value是一个Bug集合,支持存储同一名开发名下的多个Bug。
  2. 调整assignTo方法逻辑:插入前先判断当前开发对应的集合是否存在,不存在则先初始化集合,再将当前Bug加入集合,避免覆盖旧数据。
  3. 调整getAssignedTo方法逻辑:直接返回对应开发的Bug集合,删除全局共用的getAssigned集合,避免不同查询的数据互相干扰。
  4. 修正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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 02:24:07