如何在Java中读取另一个Map中的Map?

时间:2016-03-26 18:16:52

标签: java hashmap

我是Java的新手,很抱歉,如果这很明显,但我不太清楚如何在彼此内部使用2个HashMaps 我有我的主要内容,我想在地图中添加一些单词,然后,我想阅读它们:

public static void main(String[] args) {
    Dicionario d = new Dicionario();
    d.add("english", "BOOK", "Book");
    d.add("french", "BOOK", "livre");
    d.add("portuguese", "BOOK", "livro");
    d.add("english", "YEAR", "year");
    d.add("french", "YEAR", "an");
    d.add("portuguese", "YEAR", "ano");
    System.out.println(d);
}

这张地图,里面有另一张地图:

private Map<String, Map<String, String> > dic = new HashMap<>();

然后我添加这些词:

protected void add(String s1, String s2, String s3){

    Map<String, String> m = new HashMap<>();

    m.put(s2, s3);
    dic.put(s1, m);

}

并重新定义函数toString以读取它们,但每个键只显示1个值:

@Override
public String toString(){
    String s= "";

    for(Map.Entry<String, Map<String,String>> entry : dic.entrySet())
    {
        s += "\"" + entry.getKey() + "\": ";



        for(Map.Entry<String, String> entry2 : dic.get(entry.getKey()).entrySet())
        {
            s+=entry2.getKey() + "->" + entry2.getValue() + "\t";

        }
        s+="\n";
    }

    return s;
}

为什么?我正在看这个,如果它是一个二维数组,但在每个位置有2个值(键,值)。

如何显示第一张地图中的键的所有值?

谢谢,对不起这个基本问题。

2 个答案:

答案 0 :(得分:2)

您需要将添加方法修改为以下

protected void add(String s1, String s2, String s3) {
    Map<String, String> m = null;
    m = dic.get(s1);
    if (m == null) {
        m = new HashMap<>();
    }
    m.put(s2, s3);
    dic.put(s1, m);
}

答案 1 :(得分:1)

问题在于,在add(String, String, String)方法中,您每次都会实例化一个新的HashMap,以便覆盖之前调用的先前实例HashMap

您应该以这种方式更新您的方法:

protected void add(String s1, String s2, String s3){
    Map<String, String> m = dic.get(s1);

    if (m == null) {
        m = new HashMap<>();
        dic.put(s1, m);
    }

    m.put(s2, s3);
}

为避免必须亲自手动管理,我建议您使用Guava's Table数据结构(更具体地说是HashBasedTable)。