从HashMaps的HashMap中检索对象的问题

时间:2012-04-19 15:25:24

标签: java recursion hashmap

我正在编写代码,通过XML文件递归迭代并填充HashMaps的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());
                }


            }
        }       
    }

}   

谢谢!

1 个答案:

答案 0 :(得分:2)

根据OP的要求,并且由于评论中的讨论解决了他的问题 - 我将其作为答案包装 - 以供将来的读者使用:

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

System.out.println(map.keySet().iterator().next().getClass());

接下来,在我们确定您的密钥确实是String之后,我们想检查您是否有不可见的字符或不需要的空格,我们将通过添加以下行来完成:

String s = (String)map.keySet().iterator().next(); 
System.out.println("val=" + s + " length=" + s.length());

如果确实存在不可见的字符 - 我们会知道它,因为长度不匹配。

如果确实是原因[并且正如OP所说的那样],则在阅读XML时必须处理字符串以排除这些字符。

另外,作为旁注 - 我建议避免使用原始类型,并建议您尽可能使用generic types。它将为您提供更易读的代码,以及type safety
如果你想要无限制的嵌套,那么我会用composite design pattern来实现它。