我完全茫然。这是我的代码
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}}}
答案 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)));
}