我正在编写代码,通过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());
}
}
}
}
}
谢谢!
答案 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来实现它。