2012-06-21 48 views
0

我在創建一個幫助器方法的過程中,該方法將允許我遍歷XML文檔並將每個元素放入數據HashMap中,然後將其返回。這是我一直在工作方法:如何使靜態遞歸方法返回一個HashMap?

private static HashMap<String, String> traverseNodes(Node n, HashMap<String,String> data) 
{ 
    NodeList children = n.getChildNodes(); 
    if(children != null) { 
     for(int i = 0; i < children.getLength(); i++) { 
     Node childNode = children.item(i); 

     String nodeName = childNode.getNodeName(); 
     if(childNode instanceof Element) 
     { 
      data.put(nodeName, getStringByTag(nodeName, (Element)childNode)); 
      Log.d("traversal", childNode.getNodeName() + " was saved in hashmap"); 
     } 


     else 
      Log.d("traversal", childNode.getNodeName() + " Is not an Element type"); 

     System.out.println("node name = " + childNode.getNodeName()); 
     traverseNodes(childNode, data); 
     } 
    } 

    return data; 

} 

我試圖運行的例子,雖然我得到的消息說,「childNode.getNodeName()+‘被保存在HashMap中’,但HashMap中返回空。

我在做什麼錯

編輯紅利問題:?!我編輯的代碼以反映更改建議看來,然而,該方法本身不救我的XML文檔的值。 。該方法中的邏輯是否有問題?

+0

您正在爲遞歸方法的每次調用創建一個新的HashMap。這是你的意圖嗎? –

+0

如果這樣使用'data.addAll(traverseNodes(childNode));'作爲遞歸調用。雖然效率不高。 – predi

回答

2

您正在爲每次通話創建新地圖。您需要將現有的地圖轉換爲的遞歸調用。這大概應該是這樣的:

private static Map<String, String> traverseNodes(Node n) { 
    Map<String, String> map = new HashMap<String, String>(); 
    traverseNodesRecurse(n, map); 
    return map; 
} 

private static void traverseNodesRecurse(Node n, Map<String, String> map) { 
    // Logic as per question 
    // Recursive call (in the loop, etc) 
    traverseNodes(childNode, map); 

    // No need for a return statement 
} 
+0

是的,但OP的方法有可能被打破。如果樹中的兩個元素具有相同的節點名稱會怎麼樣?使用單個'HashMap'將基本上覆蓋具有相同'key'的任何條目。沒有? – Squonk

+0

@Squonk:是的,它會的 - 但我認爲這是OP想要的。這樣做 - 計算出鍵名(例如使用父節點和點符號)是一個單獨的問題。 –

+0

我知道一個事實,沒有兩個元素是相同的。然而,我最初的想法是有一個HashMaps的HashMaps意味着如果(Node.hasChildNodes()),那麼我會創建一個新的HashMap。如果不是,那麼只需將節點的值分配給HashMap即可。聽上去怎麼樣 ?基本上有一個HashMap樹模仿XML文檔的結構。 – CodePrimate

0

我想說保持HashMap的方法外,並把它作爲一個參數 -

private static HashMap<String, String> traverseNodes(Node n, HashMap<String, String> data ) 
+0

即使使用遞歸調用,它仍然可以工作嗎? – CodePrimate

+0

是的,它只會需要傳遞相同的散列表 – Kshitij

0

我想你需要類似的東西

private static HashMap<String, String> traverseNodes(Node n) { 
    HashMap<String, String> data = new HashMap<String, String>(); 
    traverseNodes(n, data); 
    return data; 
} 

private static void traverseNodes(Node n, HashMap<String, String> data) { 
    // Here is your recursive code that do data.put(key, value) 
} 
0
private static HashMap<String, String> data = new HashMap<String, String>(); 

private static traverseNodes(Node n) 
{ 
    NodeList children = n.getChildNodes(); 
    if(children != null) { 
     for(int i = 0; i < children.getLength(); i++) { 


     Node childNode = children.item(i); 

     if(childNode instanceof Element) 
     { 

      String nodeName = childNode.getNodeName(); 
      data.put(nodeName, getStringByTag(nodeName, (Element)childNode)); 
      Log.d("traversal", childNode.getNodeName() + " was saved in hashmap"); 
     } 


     else 
      Log.d("traversal", childNode.getNodeName() + " Is not an Element type"); 

     System.out.println("node name = " + childNode.getNodeName()); 
     traverseNodes(childNode); 
     } 
    } 

    return data; 

}