Java 从HashMap的HashMap检索对象时出现的问题

Java 从HashMap的HashMap检索对象时出现的问题,java,recursion,hashmap,Java,Recursion,Hashmap,我正在编写递归遍历XML文件并填充HashMap的HashMap的代码。我已经能够填充hashmap,它看起来还可以。但是,当我运行此命令时 System.out.println(map.containsKey("Mary")); 这总是错误的。真的不知道为什么它总是返回false。之后,我还发布了递归代码和hashmap的内容 map.toString() map is { Mary ={24 ={established ={western

我正在编写递归遍历XML文件并填充HashMap的HashMap的代码。我已经能够填充hashmap,它看起来还可以。但是,当我运行此命令时

 System.out.println(map.containsKey("Mary"));
这总是错误的。真的不知道为什么它总是返回false。之后,我还发布了递归代码和hashmap的内容

map.toString() 
map is { Mary
    ={24
        ={established
            ={western
                ={Profile=m}}, torn-down
            ={western
                ={Profile=b}, eastern
                ={Profile=m}}}, 44
        ={established
            ={western
                ={Profile=g}, eastern
                ={Profile=s}}, torn-down
            ={western
                ={Profile=j}, western
                ={Profile=f}}}}, Martha
    ={24
        ={established
            ={western
                ={Profile=a}}, torn-down
            ={western
                ={Profile=b}, eastern
                ={Profile=n}}}, 44
        ={established
            ={western
                ={Profile=s}, eastern
                ={Profile=j}}, torn-down
            ={western
                ={Profile=k}, eastern
                ={Profile=g}}}}}
递归代码是:

NodeList l = doc.getElementsByTagName("Branches");
        Node n = l.item(0);
        map = new HashMap();
        recurse(n, map);

private void recurse(Node n, HashMap map){
if (n.hasChildNodes()){
    NodeList nl = n.getChildNodes();

    for(int i= 0; i< nl.getLength(); i++){
        Node node = nl.item(i);

        if(node.getNodeType() == Node.ELEMENT_NODE){
            if (!node.getNodeName().equals("Profile") ){

                map.put(node.getFirstChild().getNodeValue(), new HashMap());

                recurse(node, (HashMap)map.get(node.getFirstChild().getNodeValue()));
            }
            else {

                map.put("Profile", node.getFirstChild().getNodeValue());
                }


            }
        }       
    }

}   
NodeList l=doc.getElementsByTagName(“分支”);
节点n=l.item(0);
map=新的HashMap();
递归(n,映射);
私有void递归(节点n,HashMap){
if(n.hasChildNodes()){
NodeList nl=n.getChildNodes();
对于(int i=0;i

谢谢

根据OP的要求-由于评论中的讨论解决了他的问题-我将其包装为答案-供未来读者阅读:

首先,您应该检查键是否确实是
String
对象。您可以通过添加以下行来执行此操作:

System.out.println(map.keySet().iterator().next().getClass());
接下来,在我们确定您的密钥确实是
String
s之后,我们要检查您是否有不可见的字符或不需要空格,我们将通过添加以下行来执行此操作:

String s = (String)map.keySet().iterator().next(); 
System.out.println("val=" + s + " length=" + s.length());
如果确实存在不可见字符-我们将知道,因为长度不匹配

如果这确实是原因(正如OP所说的那样),那么在读取XML时必须处理字符串以排除这些字符


另外,作为补充,我建议避免使用原始类型,并建议您尽可能使用。它将为你们提供更具可读性的代码,而且两者兼而有之
如果您想要无限制嵌套,那么我会使用来实现它。

如果可能,您应该避免使用原始类型,而更喜欢使用-它将使您的代码更具可读性和类型安全性。如果你想要无限嵌套——我会使用复合设计模式来实现它,但这只是一个建议:)在“Mary”之前有空格吗?map.containsKey(“玛丽”)给了你什么?@kent谢谢,但是map.containsKey(“玛丽”)仍然返回false。我还试着在Mary后面加一个空格,但仍然是错误的。@amit我不熟悉复合设计模式,但我会仔细阅读。谢谢。@user1192724:您能添加以下行并告诉我们它打印的内容吗<代码>System.out.println(map.keySet().iterator().next().getClass())?我试图检查第一个键是否是
字符串
对象。[我假设Mary是测试数据中的唯一键,如果不是,我们可能需要迭代并打印所有元素的所有类型]