2012-04-19 68 views
3
的一个HashMap

我写代码,遍历递归通过一个XML文件,并填充包含HashMap的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()); 
       } 


      } 
     }  
    } 

} 

谢谢!

+1

你应该避免尽可能使用原始类型,并且更喜欢使用[泛型类型(http://docs.oracle.com/javase/tutorial/java/generics/gentypes.html) - 它会使你的代码都更具可读性和安全性。如果您正在寻找无限的嵌套 - 我会用复合材料的设计模式来实现它,但它仅仅是一个建议:) – amit 2012-04-19 15:27:55

+2

有“玛丽”前的空间? map.containsKey(“Mary”)给你什么? – Kent 2012-04-19 15:29:39

+0

@kent谢谢,但map.containsKey(“Mary”)仍然返回false。我也尝试在玛丽之后放置空间,但仍然是假的。 – user1192724 2012-04-19 15:41:38

回答

2

按照要求由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排除这个角色时处理您的字符串。

此外,作为一个方面说明 - 我建议使用原始类型的避免,而且会建议你使用generic types时,它是可能的。它会给你更多的可读代码,并且两个都是type safety
如果你想要无限的嵌套,那么我会用composite design pattern来实现它。