Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中读取另一个地图中的地图?_Java_Hashmap - Fatal编程技术网

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

如何在Java中读取另一个地图中的地图?,java,hashmap,Java,Hashmap,我是Java新手,如果这很明显的话,我很抱歉,但是我不太明白如何处理彼此内部的两个哈希映射 我有我的主页,我想在地图上添加一些单词,然后,我想阅读它们: public static void main(String[] args) { Dicionario d = new Dicionario(); d.add("english", "BOOK", "Book"); d.add("french", "BOOK", "livre"); d.add("portugue

我是Java新手,如果这很明显的话,我很抱歉,但是我不太明白如何处理彼此内部的两个哈希映射 我有我的主页,我想在地图上添加一些单词,然后,我想阅读它们:

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<>();
private Map 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);

}
protectedvoid添加(字符串s1、字符串s2、字符串s3){
Map m=新的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;
}
@覆盖
公共字符串toString(){
字符串s=“”;
对于(Map.Entry:dic.entrySet())
{
s+=“\”+entry.getKey()+“\”:“;
对于(Map.Entry entry2:dic.get(Entry.getKey()).entrySet())
{
s+=entry2.getKey()+“->”+entry2.getValue()+“\t”;
}
s+=“\n”;
}
返回s;
}
为什么呢?我认为这是一个二维数组,但每个位置有2个值(key,value)

如何显示第一个映射中的键具有的所有值


谢谢,很抱歉问了这么一个基本的问题

问题在于,在
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);
}
protectedvoid添加(字符串s1、字符串s2、字符串s3){
Map m=dic.get(s1);
如果(m==null){
m=新的HashMap();
dic.put(s1,m);
}
m、 put(s2,s3);
}

为了避免自己手动管理,我建议您使用数据结构(更具体地说)。

您需要将您的add方法修改为以下内容

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);
}
protectedvoid添加(字符串s1、字符串s2、字符串s3){
Map m=null;
m=dic.get(s1);
如果(m==null){
m=新的HashMap();
}
m、 put(s2,s3);
dic.put(s1,m);
}

不会
dic.get(s1)
从文档中抛出NullPointerException?V get(对象键)返回指定键映射到的值,如果此映射不包含键的映射,则返回null。()但是此解决方案也会覆盖以前存储的值,不是吗?OP正在添加重复的键。他可能想要的是一个
map从OP给出的例子来看,假设(s1,s2)的组合是唯一的似乎很安全。是的,(s1,s2)的组合总是唯一的。这只是一个关于制作一本蹩脚字典的练习,在这本字典中,单词只有一个翻译:p谢谢你,我真的以为
dic.put(s1,m)
会将另一个地图的开头指向键s1,而不需要使用
dic.get(s1)
。谢谢:)在您的原始代码中,您正在执行Map m=newhashmap();这是在重置hashmap。在hashmap中想象map有点棘手。好问题。:-)