3

我正在编写通过 XML 文件递归迭代并填充 HashMap 的 HashMap 的代码。我已经能够填充哈希图,它看起来不错。但是,当我运行此命令时

 System.out.println(map.containsKey("Mary"));

它总是假的。真的不知道为什么它总是返回假。之后我还发布了我的递归代码和哈希图的内容

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());
                }


            }
        }       
    }

}   

谢谢!

4

1 回答 1

2

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

首先,您应该检查您的键是否确实是String对象。您可以通过添加以下行来做到这一点:

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

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

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

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

如果这确实是原因[并且正如 OP 所说的那样],那么在读取 XML 以排除这些字符时,您将不得不处理您的字符串。

另外,作为旁注 - 我建议避免使用原始类型,并建议您尽可能使用泛型类型。它将为您提供更易读的代码和类型安全
如果您想要无限嵌套,那么我会使用复合设计模式来实现它。

于 2012-04-19T17:25:08.170 回答