这个问题与递归有关。考虑下面显示的程序(不是我的真实代码,但这解释了我遇到的问题)。
函数必须使用递归,如图所示,我想要做的是让每个叶子值而不是打印出来的方式保存到列表中。所以最后我得到一个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;
}
所以我的问题是,如何以一种方式重新编写遍历函数,它仍然使用递归但将所有叶节点保存到列表中。然后它返回所有值的列表。
答案 0 :(得分:2)
这个在List中存储您使用遍历函数打印的相同字符串,并且您不需要将List作为参数传递:
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;
}
答案 1 :(得分:0)
您可以返回一个列表并将递归调用中的元素添加到当前调用的结果列表中,或者将列表作为参数传递并直接添加结果。
答案 2 :(得分: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;
}