Java-无法访问HashMap中的HashMap

Java-无法访问HashMap中的HashMap,java,hashmap,nested,Java,Hashmap,Nested,我已经检查过堆栈溢出,但找不到解决问题的方法 我有一个类,它遍历字符并将数据文本文件转换为hashmap,我遇到以下问题 在我将data key:value对的HashMap添加到HashMaps的HashMap之前,它工作正常,并且我能够访问以下数据: 在ConfigHandler.java中: public Map<String, Map<String, String>> getContainerList() { return this.containers;

我已经检查过堆栈溢出,但找不到解决问题的方法

我有一个类,它遍历字符并将数据文本文件转换为hashmap,我遇到以下问题

在我将data key:value对的HashMap添加到HashMaps的HashMap之前,它工作正常,并且我能够访问以下数据:

在ConfigHandler.java中:

public Map<String, Map<String, String>> getContainerList()
{
    return this.containers;
}

public Map<String, String> getContainer(String name)
{
    return (Map<String, String>)this.containers.get(name);
}
临时地图:

Map<String, String> tempHashMap = new HashMap<>();
可读格式的代码:

this.containers.put(this.currentHashMapKey, tempHashMap);
this.currentHashMapKey = "";
//CHECK KEY, VALUE PAIRS
for(Map.Entry<String, String> entry: tempHashMap.entrySet())
{
    String key = entry.getKey();
    String value = entry.getValue();

    System.out.println(key + ":" + value);
}
tempHashMap.clear()
然而,一旦它被添加到“超级HashMap”中,尽管我可以用它的键访问对象,但我得到的HashMap是空的

注意,当直接在ConfigHandler类中时,这也不起作用

在ConfigHandler.java中:

public Map<String, Map<String, String>> getContainerList()
{
    return this.containers;
}

public Map<String, String> getContainer(String name)
{
    return (Map<String, String>)this.containers.get(name);
}
在另一个类的静态{}方法和一大堆try/catch中:

staticReader.read(readerChars);
oreChanceConfig = new ConfigHandler(readerChars, false);

Map<String, String> chances = oreChanceConfig.getContainer("Chances");

if (oreChanceConfig.getContainerList().containsKey("Chances"))
{
    if (chances.containsKey("Saltpeter")) //It should contain this key, but doesn't
    {
        System.out.println("It actually Works"); //Does not get printed
    } else {
        System.out.println("Key Value Pairs:"); //this gets printed
        //the following loop prints nothing
        for (Map.Entry<String, String> entry : chances.entrySet()) {
            String key = entry.getKey();
            String value = entry.getValue();

            System.out.println(key + ":" + value);
        }
    }
}
HashMaps初始化代码的HashMap:

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

我不确定我是否真的理解你对你正在做的事情的描述,但这一点很突出:

    this.containers.put(this.currentHashMapKey, tempHashMap);
    // ...
    tempHashMap.clear();
调用clear时,将从tempHashMap中删除所有条目。由于这是作为值添加到容器映射中的映射对象,因此也在清除它

一个可能的解决方案是在每次迭代中创建一个新的tempHashMap。。。在将其添加到容器后,不要调用clear

说明:

当你添加HashMap时,我认为它创建了一个HashMap的副本

你似乎认为

    this.containers.put(this.currentHashMapKey, tempHashMap);
将创建tempHashMap的副本

事实并非如此

实际上,您正在做的是将对临时哈希映射的引用存储为容器映射中的条目值。事实上,如果重用临时映射,那么最终将在容器映射中创建对该映射对象的多个引用

Map::putkey,value操作不会复制/克隆/任何key对象或value对象。它只是将引用存储在映射条目中。如果随后对这些对象进行变异:

改变值会更改通过贴图可见的内容 改变键会破坏映射!。 当我创建一个新的HashMap时,它不会覆盖以前的HashMap吗

不会的。它创建了一个新的。考虑这一点:

    Map<String, String> tempHashMap = new HashMap<>();
    tempHashMap.put("key", "value");
    tempHashMap = new HashMap<>();
第三条语句创建一个新的HashMap对象,并将引用分配给tempHashMap变量。它将替换变量中的原始引用值,但不会影响第一个HashMap对象。如果仍然有对原始对象的引用,则仍然可以查找键并获得相应的值

这是基本的Java辅助语义。通过使用=,或通过传递参数来分配对象,只分配引用。它不会覆盖实际的对象状态

这与C和C++不同,其中对象或结构的赋值和指针到对象/结构的分配是根本不同的操作。

< P>尝试替换这个:

Map<String, String> chances = oreChanceConfig.getContainer("Chances");
if (oreChanceConfig.getContainerList().containsKey("Chances")) {
......
}
据此:

Map<String, String> chances = oreChanceConfig.getContainerList().get("Chances");
if (chances != null) {
......
}

希望这有帮助

如果您不用在映射中使用映射,而是使用名称、类型化属性和方法定义类,那么一切都会变得简单得多。什么更清楚?列表还是映射?您的映射可能是“空白”的,因为您正在执行tempHashMap.clear;在将地图添加到超级地图后?将尝试,谢谢:你知道为什么你现在所做的是错误的吗?不是真的。。。当你添加HashMap时,我认为它创建了一个HashMap的副本。当我创建一个新的HashMap时,它不会覆盖以前的HashMap吗。我最初创建了一个新的HashMap,然后每次我需要一个新的HashMap时,我只做tempHashMap=newhashmap;