复制哈希映射

时间:2012-06-08 06:23:15

标签: java

我有一个结构

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地图中的英文文本。你能告诉我有什么问题吗?如果有更好的方法可以告诉我。

谢谢!

4 个答案:

答案 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);

第二个HashMapmap2)会包含与Date包含的map1个相同的实例。 date1map1.get("one")map2.get("one")将引用相同的Date对象,因此以下表达式将返回3000作为结果:

date1.getTime();
map1.get("one").getTime();
map2.get("one").getTime();

当您将另一个HashMap放入HashMap时会发生这种情况。从第二次迭代开始,您将一遍又一遍地修改相同的HashMap

答案 3 :(得分:0)

我已深入克隆(使用对象serializationdeserialization)部分hashmap并存储在临时hashmap中并使用临时hashmap添加现在可以根据语言添加问题文本,制作我的语言hashmap