Java 用于将值保存到列表的简单递归函数

Java 用于将值保存到列表的简单递归函数,java,xml,recursion,Java,Xml,Recursion,这个问题与递归有关。考虑下面的程序(不是我的真实代码,但这解释了我的问题)。 函数必须使用递归,如图所示,我想做的是将每个叶值保存到列表中,而不是打印出来。最后我得到了一个列表,当我打印出来时,它会给出每个叶节点的内容 String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<title text=\"title1\">\n" + " <comment id=\"comment1\">

这个问题与递归有关。考虑下面的程序(不是我的真实代码,但这解释了我的问题)。 函数必须使用递归,如图所示,我想做的是将每个叶值保存到列表中,而不是打印出来。最后我得到了一个
列表
,当我打印出来时,它会给出每个叶节点的内容

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;
}
String xml=“\n”+
“\n”+
“\n”+
“abcd\n”+
“efgh\n”+
“\n”+
“\n”+
“ijkl\n”+
“mnop\n”+
“qrst\n”+
“\n”+
“\n”;
DocumentBuilder=DocumentBuilderFactory.newInstance().newDocumentBuilder();
documentdoc=builder.parse(新的InputSource(新的StringReader(xml));
列表结果=遍历(doc.getFirstChild());
//要在此处打印结果列表。。。
公共静态列表遍历(节点){
System.out.println(node.getNodeName());
对于(int i=0;i

所以我的问题是,如何重新编写遍历函数,使其仍然使用递归,但将所有叶节点保存到列表中。然后它返回所有值的列表。

您可以返回一个列表并将递归调用中的元素添加到当前调用的结果列表中,或者将列表作为参数传递并直接添加结果。

我想您需要的是这样的:

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;
}
publicstaticvoid遍历(节点,列出结果){
if(node.getChildNodes().getLength()==0){
//叶节
add(node.getNodeValue());
}
否则{
//走遍所有的孩子
对于(int i=0;i
此函数将使用遍历函数打印的字符串存储在列表中,您不需要将列表作为参数传递:

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;
    }
公共静态列表遍历(节点){
列表结果=新建LinkedList();
add(node.getNodeName());
if(node.getChildNodes().getLength()>0){
对于(int i=0;i
你的问题是…?必须使用递归表示这是家庭作业吗?(这不是问题,但我会相应地重新标记问题)你试过什么吗?甚至没有什么事可做!不要指望这个网站不首先尝试就给你代码…我想重新编写遍历函数,它仍然使用递归,但将所有叶节点保存到列表中,然后返回所有值的列表。我已经尝试了很多,这不是家庭作业。请看我前面的一些问题,我需要使用递归来正确地将xml文档转换为表。谢谢,这就是我正在寻找的解决方案。实际上它和我的很相似,但我注意到我还有一个bug。显然,如果列表是其他对象类型,则需要向列表中添加一个新对象,而不是重复出现的对象!我记得您说过希望列表的内容包含每个叶节点。这将为您提供一个包含所有节点的列表。@Kevin这是真的。。。但我追求的主要目标是在列表中存储递归数据的方法。我猜真正的解决方案是你的和这个的混合,但我支持这一点,因为我喜欢它不修改函数签名的方式,而你的方式是这样的。你可以通过简单地在“results.add(node.getNodeName());”之前添加一个IF来过滤添加到列表中的字符串因此,您可以检查该节点是否为#文本节点,然后添加其子值;这样,函数仍然可以工作,并且只能有叶节点。@拉里:这不是你认为的问题。请参阅我的最新答案。我认为在这个解决方案中为xml树中的每个节点分配一个新的链表有点草率。