0

我有一个结构

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

多种语言有多个部分,多个部分有多个问题。问题是值正在被写入,即如果我有第一语言的法语文本和第二语言的英语文本,我只会在我制作的两个语言映射中看到英文文本。你能告诉我有什么问题吗?让我知道是否有更好的方法来做到这一点。

谢谢!

4

4 回答 4

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

于 2012-06-08T06:41:56.787 回答
0

当您从 map2 创建临时哈希映射时,它会创建新的映射对象。但是这个新地图 (tempMap) 的值与您在 map2 中的对象相同。因此,如果您在 tempMap 中更改值对象 - map2 中也会发生相同的更改。简单的克隆没有帮助 - 它只克隆 HashMap,而不是键和对象。所以你必须在复制时克隆你的对象(ke)。

于 2012-06-08T06:47:40.800 回答
0

问题是您正在HashMap使用浅拷贝复制 s,这是所有 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) 将包含相同的Dates实例map1date1,map1.get("one")并且map2.get("one")将引用同一个Date对象,因此以下表达式都将3000作为结果返回:

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

当您将另一个HashMap放入HashMap. 从第二次迭代开始,您将HashMap一遍又一遍地修改相同的内容。

于 2012-06-08T06:52:21.340 回答
0

我已经深度克隆(使用 objectserializationdeserialization)该部分hashmap并存储在 temp 中hashmap,并使用 temphashmap添加问题文本,现在可以根据语言添加问题文本,制作我的 lang hashmap

于 2012-06-08T17:53:41.140 回答