.putAll()是否会影响复制的变量?

时间:2018-08-31 16:57:12

标签: java android hashmap

我完全茫然。这是我的代码

HashMap >> themap =新的HashMap >>(); HashMap> externalMap = new HashMap>();

...
//themap is populated through OnCreate(), and works fine.

    @SuppressWarnings("StatementWithEmptyBody")
        @Override
        public boolean onNavigationItemSelected(MenuItem item) {
                String currentfragment = "my_string"
                ...
                HashMap<String, HashMap<String, HashMap<String, Integer>>> copymap = copy(themap);
                System.out.println("1" + themap);
                outerMap.putAll(copymap.get(currentfragment));
                System.out.println("2" + themap);
                ...
        }

在另一种方法中,themap的某些值被更改。问题在于,当调用onNavigationItemSelected时,第一个.println()将打印右地图,并更改其值;第二个.println()将打印themap,并将其初始值更改。我做错了什么?

编辑:我已经按照How to copy HashMap (not shallow copy) in Java的说明进行操作,但是仍然无法正常工作。我已经更新了之前的代码,这是我的copy方法:

public static HashMap<String, HashMap<String, HashMap<String, Integer>>> copy(HashMap<String, HashMap<String, HashMap<String, Integer>>> original) {
    HashMap<String, HashMap<String, HashMap<String, Integer>>> copy = new HashMap<>();
    for (Map.Entry<String, HashMap<String, HashMap<String, Integer>>> entry : original.entrySet()) {
        HashMap<String, HashMap<String, Integer>> copyInnerMap = new HashMap<>();
        for (Map.Entry<String, HashMap<String, Integer>> innerEntry : entry.getValue().entrySet()) {
            HashMap<String, Integer> innerInnerMap = innerEntry.getValue();
            HashMap<String, Integer> copiedInnerInnerMap = new HashMap<>();
            for (Map.Entry<String, Integer> innerInnerMapEntry : innerInnerMap.entrySet()) {
                copiedInnerInnerMap.put(innerInnerMapEntry.getKey(), innerInnerMapEntry.getValue());
            }
            copyInnerMap.put(innerEntry.getKey(), copiedInnerInnerMap);
        }
        copy.put(entry.getKey(), copyInnerMap);
    }
    return copy;
}

EDIT2 :我已经更新了我的复制方法,使其足够深入。
这是第一个输出:
1 {compu = {Day1 = {工作时间= 0,学习时间= 0,白天成绩= -1,填写的工作表= 0,乐趣= 0},Day2 = {工作时间= 0,学习时间= 0,白天成绩= -1,工作表已填充= 0,乐趣= 0,第3天= {工作时间= 0,学习时间= 0,日成绩= -1,工作表已填充= 0,乐趣= 0}},化学= {第1天= {工作小时= 0,学习时间= 0,日成绩= -1,工作表填写= 0,乐趣= 0,},第2天= {工作时间= 0,学习时间= 0,天成绩= -1,工作表填充= 0,乐趣= 0},第3天= {工作时间= 0,学习时间= 0,白天成绩= -1,工作表填充= 0,乐趣= 0}},数学= {第1天= {工作时间= 0,学习时间= 0,日成绩= -1,工作表填充= 0,乐趣= 0,第2天= {工作时间= 0,学习时间= 0,工作日评分= -1,工作表填充= 0,乐趣= 2} ,第3天= {工作时间= 0,学习时间= 0,日成绩= -1,工作表填充= 0,乐趣= 0}},物理= {第1天= {工作时间= 0,学习时间= 0,工作日评分= -1,工作表已填充= 0,乐趣= 0,第2天= {工作时间= 0,学习时间= 0,日成绩= -1,工作表已填充= 0,乐趣= 0,},第3天= {工作时间= 0 ,学习时间= 0,日成绩= -1,工作表填充= 0,乐趣= 0}},无= {第1天= {工作时间= 0,学习时间= 0,日成绩s = -1,工作表已填充= 0,乐趣= 0,第2天= {工作时间= 0,学习时间= 0,日成绩= -1,工作表已填充= 0,乐趣= 2},第3天= {工作时间= 0,学习小时= 0,日成绩= -1,工作表填充= 0,乐趣= 0}}}

第二个:
2 {compu = {Day1 = {工作时间= 0,学习时间= 0,一天成绩= -1,填写的工作表= 0,乐趣= 0},Day2 = {工作时间= 0,学习时间= 0,工作成绩= -1,工作表已填充= 0,乐趣= 0,第3天= {工作时间= 0,学习时间= 0,日成绩= -1,工作表已填充= 0,乐趣= 0}},化学= {第1天= {工作小时= 0,学习时间= 0,日成绩= -1,工作表填写= 0,乐趣= 0,},第2天= {工作时间= 0,学习时间= 0,天成绩= -1,工作表填充= 0,乐趣= 0},第3天= {工作时间= 0,学习时间= 0,白天成绩= -1,工作表填充= 0,乐趣= 0}},数学= {第1天= {工作时间= 0,学习时间= 0,日成绩= -1,工作表填充= 0,乐趣= 0},第2天= {工作时间= 0,学习时间= 0,工作日分数= -1,工作表填充= 0,乐趣= 0} ,第3天= {工作时间= 0,学习时间= 0,日成绩= -1,工作表填充= 0,乐趣= 0}},物理= {第1天= {工作时间= 0,学习时间= 0,工作日评分= -1,工作表已填充= 0,乐趣= 0,第2天= {工作时间= 0,学习时间= 0,日成绩= -1,工作表已填充= 0,乐趣= 0,},第3天= {工作时间= 0 ,学习时间= 0,日成绩= -1,工作表填充= 0,乐趣= 0}},无= {第1天= {工作时间= 0,学习时间= 0,日成绩s = -1,工作表已填充= 0,乐趣= 0,第2天= {工作时间= 0,学习时间= 0,天成绩= -1,工作表已填充= 0,乐趣= 0},第3天= {工作时间= 0,学习小时= 0,日成绩= -1,工作表填充= 0,乐趣= 0}}}

1 个答案:

答案 0 :(得分:0)

由于您具有2个级别的哈希图,因此复制的深度不够。尝试用以下代码替换outerMap.putAll(copymap.get(currentfragment));

HashMap<String, HashMap<String, Integer>> sample = themap.get(currentfragment);
for (String s : sample.keySet()) {
    outerMap.put(s, new HashMap<>(sample.get(s)));
}