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

セクションを(objectserializationと)を使用してディープクローンし、tempに保存し、tempを使用して質問テキストを追加しました。これにより、言語に応じて追加できるようになり、langが作成されます。deserializationhashmaphashmaphashmaphashmap

于 2012-06-08T17:53:41.140 に答える
0

map2 から一時ハッシュ マップを作成すると、マップの新しいオブジェクトが作成されます。ただし、この新しいマップ (tempMap) の値は、map2 にあるオブジェクトと同じです。したがって、tempMap で値オブジェクトを変更すると、同じ変更が map2 にも適用されます。単純な複製は役に立ちません。キーとオブジェクトではなく、HashMap のみを複製します。そのため、コピーするときにオブジェクト (ke) を複製する必要があります。

于 2012-06-08T06:47:40.800 に答える
0

問題はHashMap、すべての Java コレクションのデフォルトの動作である浅いコピーを使用して s をコピーしていることです。これを単純化して の 1 レベルだけにしましょう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);

2 番目のHashMap( ) には、含むs のmap2同じインスタンスが含まれます。、および同じオブジェクトを参照するため、次の式はすべて結果として返されます。Datemap1date1map1.get("one")map2.get("one")Date3000

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

HashMapこれは、別のものを に入れると発生しますHashMap。2 回目の反復から、同じものHashMapを何度も変更します。

于 2012-06-08T06:52:21.340 に答える