2011-08-29 30 views
0

此問題涉及遞歸。考慮下面顯示的程序(不是我真實的代碼,但這解釋了我的問題)。將值保存到列表的簡單遞歸函數

功能必須使用遞歸如圖所示,我想要做的是讓每個葉值而不是打印出來的方式保存到列表中。所以最後我得到一個List<String>,當我打印出來給我的每個葉節點的內容。

String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + 
"<title text=\"title1\">\n" + 
" <comment id=\"comment1\">\n" + 
"  <data> abcd </data>\n" + 
"  <data> efgh </data>\n" + 
" </comment>\n" + 
" <comment id=\"comment2\">\n" + 
"  <data> ijkl </data>\n" + 
"  <data> mnop </data>\n" + 
"  <data> qrst </data>\n" + 
" </comment>\n" + 
"</title>\n"; 

DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); 
Document doc = builder.parse(new InputSource(new StringReader(xml))); 

List<String> results = traverse(doc.getFirstChild()); 

//Want to print out results list here... 

public static List<String> traverse(Node node){ 
    System.out.println(node.getNodeName()); 
    for(int i = 0; i < node.getChildNodes().getLength(); i++){ 
     traverse(node.getChildNodes().item(i));   
    } 
    return null; 
} 

所以我的問題是,因爲,它仍然使用遞歸,但保存所有的葉子節點列表的方式如何我重新寫的遍歷功能。然後它返回所有值的列表。

+4

而你的問題是......? –

+0

「必須使用遞歸」暗示這是作業嗎? (這不會是一個問題,但我會重申相應的問題) – Shlublu

+0

你甚至嘗試過什麼嗎?甚至沒有太多要做!不要期望這個網站給你沒有先嚐試的代碼... – f1sh

回答

2

這一個存儲在一個列表你與你的遍歷功能打印相同的字符串,你不需要通過列表作爲參數:

public static List<String> traverse(Node node) { 
     List<String> results = new LinkedList(); 
     results.add(node.getNodeName()); 
     if (node.getChildNodes().getLength() > 0) { 
      for (int i = 0; i < node.getChildNodes().getLength(); i++) 
       results.addAll(traverse(node.getChildNodes().item(i))); 
     } 
     return results; 
    } 
+0

謝謝,這是我尋找的解決方案。其實它和我的相似,但我注意到我有另一個bug。顯然,如果List是其他對象類型的,則需要向列表中添加一個'new'對象,而不是重複的對象! – Larry

+0

我以爲你說過你想讓列表的內容包含每個葉節點。這給你一個所有節點的列表。 – Kevin

+0

@Kevin這是真的......但我後來的主要事情是一種將遞歸數據存儲在列表中的方法。我想真正的解決方案是你和這個人之間的混合體,但我贊同這一點,因爲我喜歡它不修改函數簽名的方式,而你的方式卻是這樣。 – Larry

0

您可以返回一個列表並將遞歸調用中的元素添加到當前調用的結果列表中,或將該列表作爲參數傳遞並直接添加結果。

0

我想你想要的是這樣的:

public static void traverse(Node node, List<String> results) { 
    if (node.getChildNodes().getLength() == 0) { 
     // leaf node 
     results.add(node.getNodeValue()); 
    } 
    else { 
     // walk all children 
     for (int i = 0; i < node.getChildNodes().getLength(); i++) { 
      traverse(node.getChildNodes().item(i)); 
     } 
    } 
} 
public static List<String> traverse(Node node) { 
    List<String> result = new LinkedList<String>(); 
    traverse(node,result); 
    return result; 
}