【问题标题】:A map contains another Map in Java一个地图包含另一个 Java 地图
【发布时间】:2015-01-09 09:59:32
【问题描述】:

我想创建一个包含另一个地图的地图。如果内部地图中没有特殊键,我想创建 value= 1 的那个键,否则增加它的值。
我写了 this代码

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

【问题讨论】:

    标签: java dictionary hashmap set


    【解决方案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);                    
        }
    }
    

    【讨论】:

    • 谢谢,我该如何解决这个问题?
    • 谢谢,效果很好。但是,如果您能解释这些行的效果,我真的很感激: k= new HashMap();和你的第二个代码(if (k != null) ...)
    • @Masoud 您需要为外部地图的每个键创建内部地图的新实例,否则 ingMap.get("A") 和 ingMap.get("B") 将返回完全相同的内部地图。至于后面的代码,当你通过key从map中取值时,你应该检查返回的值是否不为null。如果“A”键的内部映射已经存在,则无需再次放置(“A”,k)。只需要修改“A”的内图即可。
    猜你喜欢
    • 2012-05-15
    • 1970-01-01
    • 2017-08-30
    • 2015-10-03
    • 2015-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多