将元素添加到HashMap内的HashSet

时间:2014-03-23 22:01:59

标签: java collections hashmap hashset

我有一个HashSet,它位于HashMap中,而HashMap又位于另一个HashMap中。当我尝试在一个键下向此HashSet添加元素时,元素将添加到外部HashMap的所有其他键中。 这是我的代码:

import java.util.HashSet;
import java.util.HashMap;
import java.util.Map;

public class Student {
    public static void main(String args[]) {
        Map<String, HashMap<Integer,HashSet<Integer>>> sections
            = new HashMap<String, HashMap<Integer,HashSet<Integer>>>();

        HashMap<Integer, HashSet<Integer>> empty_map = new HashMap<Integer, HashSet<Integer>>();
        sections.put("A", empty_map);
        sections.put("B", empty_map);
        int strength = 0;
        int init = 1;
        int id1 = 1,id2 = 5;
        while (strength < 3) {

            // Add elements only to the HashSet under the HashMap of key "A"

            if (! sections.get("A").containsKey(init))
                sections.get("A").put(init, new HashSet<Integer>());

            // If the key init is already present then simply add values to it.
            sections.get("A").get(init).add(id1);
            sections.get("A").get(init).add(id2);

            System.out.println(sections);

        strength++;
        init++;
        }
    }

}

此代码的输出为:

{A={1=[1, 5]}, B={1=[1, 5]}}
{A={1=[1, 5], 2=[1, 5]}, B={1=[1, 5], 2=[1, 5]}}
{A={1=[1, 5], 2=[1, 5], 3=[1, 5]}, B={1=[1, 5], 2=[1, 5], 3=[1, 5]}}

为什么要将元素添加到&#34; B&#34;下的HashMap中?键?

2 个答案:

答案 0 :(得分:4)

问题在于:

HashMap<Integer, HashSet<Integer>> empty_map = new HashMap<Integer, HashSet<Integer>>();
sections.put("A", empty_map);
sections.put("B", empty_map);

您为A和B键添加了相同的对象。因此,修改与A关联的地图的任何更改也会修改与B关联的地图,反之亦然。

想想这样的情况:

enter image description here

您必须为每个键创建一个新对象。

sections.put("A", new HashMap<Integer, HashSet<Integer>>());
sections.put("B", new HashMap<Integer, HashSet<Integer>>());

它输出:

{A={1=[1, 5]}, B={}}
{A={1=[1, 5], 2=[1, 5]}, B={}}
{A={1=[1, 5], 2=[1, 5], 3=[1, 5]}, B={}}

答案 1 :(得分:1)

密钥"A""B"两个&#34;指向&#34;相同的HashMap。 (对象通过引用传递。)尝试改写:

sections.put("A", new HashMap<Integer, HashSet<Integer>>());
sections.put("B", new HashMap<Integer, HashSet<Integer>>());