Java向Map添加元素时多key对应Set重复问题求解
问题原因
- 核心是所有key共享了同一个
Set<String>实例:你大概率是在循环外只创建了一次Set对象,每次输入国家后直接往这个Set里添加元素,再把这个Set赋值给TreeMap的不同key。因为Java是引用传递,TreeMap里所有key存储的都是同一个Set的内存地址,最终这个Set积累了所有输入的国家,自然所有key查询到的内容完全一致。
典型错误代码示例
TreeMap<Integer, Set<String>> groupA = new TreeMap<>(); Set<String> countries = new HashSet<>(); // 仅在循环外创建一次Set实例 Scanner sc = new Scanner(System.in); for (int i = 1; i <= 4; i++) { System.out.println("请输入第" + i + "个国家:"); String country = sc.nextLine(); countries.add(country); groupA.put(i, countries); // 每次都存入同一个Set的引用 }
解决方法
- 每次循环都创建新的Set实例,确保每个key对应独立的存储容器:把Set的创建逻辑移动到循环内部,每录入一个国家就新建一个Set存储该国家,再放到TreeMap对应的key中即可。
修正后代码示例
TreeMap<Integer, Set<String>> groupA = new TreeMap<>(); Scanner sc = new Scanner(System.in); for (int i = 1; i <= 4; i++) { System.out.println("请输入第" + i + "个国家:"); String country = sc.nextLine(); Set<String> countries = new HashSet<>(); // 每次循环新建独立的Set实例 countries.add(country); groupA.put(i, countries); }
- 如果你确认每个key仅对应单个国家,也可以直接将TreeMap的泛型改为
TreeMap<Integer, String>,无需使用Set存储,逻辑更简洁。
内容的提问来源于stack exchange,提问作者Madman_G3cko
相关产品推荐
相关产品推荐

