我有一个结构
HashMap<String,HashMap<Integer, HashMap<Integer, question>>> lang=new HashMap<String,HashMap<Integer, HashMap<Integer, question>>>();
HashMap<Integer,HashMap<Integer,question>> section= new HashMap<Integer,HashMap<Integer,question>>();
HashMap<Integer,question> questions= new HashMap<Integer,question>();
根据我的逻辑填写问题,
部分while(logic){
for(someother logic){
//make the skeleton structure of the object
questions.add(integer,object);
}
section.add(integer,map3);
}
现在我将此map2用作骨架并进行更改
HashMap<Integer,HashMap<Integer,object>> tempMap= new HashMap<Integer,HashMap<Integer,object>>();
while(logicnew){
while(logic 2){
tempMap = new HashMap(section);
while(logic 3){
tempMap2 = new HashMap(tempMap.get(integer));
//make my changes
}
}
lang.add(integer,tempMap);
}
多种语言有多个部分,多个部分有多个问题。 问题是价值越来越多,即如果我有第一语言的法语文本和第二语言的英文文本,我只看到我制作的lang地图中的英文文本。你能告诉我有什么问题吗?如果有更好的方法可以告诉我。
谢谢!
答案 0 :(得分:2)
HashMap是一个通过引用传递的对象(你应该阅读它)。
如果要重用map2,请确保正确克隆map2。否则,您对map2所做的修改将反映在所有HashMap实例中。
在重复使用map2之前执行此操作:
map2 = (HashMap) map2.clone();
请注意,这是浅色副本。
请在此处了解详情:http://docs.oracle.com/javase/6/docs/api/java/util/HashMap.html#clone%28%29
HashMap的深度克隆:
public HashMap deepClone(HashMap map) {
HashMap clone = new HashMap();
Iterator it = map.keySet().iterator();
while (it.hasNext()) {
Object key = it.next();
Object value = map.get(key);
clone.put(key.clone(), value.clone());
}
return clone;
}
这只是一个示例实现,为您提供了一个模板。您应该确保HashMap是类型安全的,并且键和值具有Object.clone()的深度克隆实现
答案 1 :(得分:0)
当您从map2创建临时哈希映射时,它会创建新的map对象。但是这个新映射(tempMap)的值与map2中的对象相同。因此,如果您在tempMap中更改值对象 - 相同的更改将在map2中。简单的克隆没有帮助 - 它只克隆HashMap,而不是它的键和对象。所以你必须在复制时克隆你的对象(ke)。
答案 2 :(得分:0)
问题是您使用浅拷贝复制HashMap
,这是所有Java集合的默认行为。
我们将其简化为HashMap
的一个级别。请考虑以下代码:
Date date1 = new Date(1000);
Date date2 = new Date(2000);
HashMap<String, Date> map1 = new HashMap<String, Date>();
map1.put("one", date1);
map1.put("two", date2);
HashMap<String, Date> map2 = new HashMap<String, Date>(map1);
map2.get("one").setTime(3000);
第二个HashMap
(map2
)会包含与Date
包含的map1
个相同的实例。 date1
,map1.get("one")
和map2.get("one")
将引用相同的Date
对象,因此以下表达式将返回3000
作为结果:
date1.getTime();
map1.get("one").getTime();
map2.get("one").getTime();
当您将另一个HashMap
放入HashMap
时会发生这种情况。从第二次迭代开始,您将一遍又一遍地修改相同的HashMap
。
答案 3 :(得分:0)
我已深入克隆(使用对象serialization
和deserialization
)部分hashmap
并存储在临时hashmap
中并使用临时hashmap
添加现在可以根据语言添加问题文本,制作我的语言hashmap
。