这个问题涉及到递归。考虑下面显示的程序(不是我的真实代码,但这解释了我遇到的问题)。
函数必须使用递归,如图所示,我想要做的是有一种方法可以将每个叶值保存到列表中,而不是打印出来。所以最后我得到了 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;
}
所以我的问题是,如何重写遍历函数,使其仍然使用递归,但将所有叶节点保存到列表中。然后它返回所有值的列表。
最佳答案
此函数将您使用遍历函数打印的相同字符串存储在列表中,并且您不需要将列表作为参数传递:
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;
}
关于java - 将值保存到列表的简单递归函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7231648/