地图包含Java中的另一个地图

时间:2015-01-09 09:59:33

标签: java dictionary hashmap set

我想创建一个包含另一个map的Map。如果内部Map中没有特殊键,我想用value = 1创建该键,否则增加它的值。
我写了这段代码

Map <String, Map <String,Double>> ingMap= new HashMap<>();
Map <String,Double> k= new HashMap<>();
k.put("Class1", 1.0);
ingMap.put("A", k);
k.put("Class2", 1.0);
ingMap.put("A", k);
k.put("Class1", 1.0);
ingMap.put("B", k);
k.put("Class2", 1.0);
ingMap.put("B", k);
k = ingMap.get("A");
if (k.containsKey("Class3")) {            
    k.put("Class3", k.get(k)+1);
    ingMap.put("A", k );
}
else{                        
    k.put("Class3", 1.0);
    ingMap.put("A",k );                       
 }
 System.out.println("\n" + ingMap); 

结果是:

{A={Class1=1.0, Class2=1.0, Class3=1.0}, B={Class1=1.0, Class2=1.0, **Class3=1.0}**}

但我真的想要:

{A={Class1=1.0, Class2=1.0, Class3=1.0}, B={Class1=1.0, Class2=1.0}}

1 个答案:

答案 0 :(得分:1)

您将相同的内部地图k放在外部地图的所有值中。 您需要为每个外部地图键创建一个新的内部地图实例:

Map <String,Double> k= new HashMap<>();
k.put("Class1", 1.0);
k.put("Class2", 1.0);
ingMap.put("A", k);

k= new HashMap<>();
k.put("Class1", 1.0);
k.put("Class2", 1.0);
ingMap.put("B", k);

并且没有必要将相同的值放在同一个值上两次,因为它什么都不做。

更新内部地图的代码应该是这样的:

k = ingMap.get("A");
if (k != null) {
    if (k.containsKey("Class3")) {            
        k.put("Class3", k.get("Class3")+1);
    }
    else {                        
        k.put("Class3", 1.0);                    
    }
}