我有一个结构

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);
}


多种语言有多个部分,多个部分有多个问题。
问题是值已经写完了,即如果我的第一语言的法语文本和第二语言的英语文本,我在制作的两个语言映射中都只能看到英语文本。你能告诉我出什么问题了吗?让我知道是否还有更好的方法。

谢谢!

最佳答案

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()的深层克隆实现。

关于java - 复制哈希图,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10943958/

10-13 09:53