Java 迭代递归对象

Java 迭代递归对象,java,Java,我试图迭代递归对象,但据我所知,Java不支持这一点 例如,给定对象项: 使用for循环,我可以迭代子循环,但由于子循环将包含更多的子循环,从而包含更多的子循环等等,因此无法根据该深度自动确定深度和循环 是否有一种迭代递归对象的方法?如果父子树中没有循环,则可以使用简单的递归函数来确定子体的数量: public class Item { ... public int getDescendantCount() { int count = 0; if

我试图迭代递归对象,但据我所知,Java不支持这一点

例如,给定对象项:

使用for循环,我可以迭代子循环,但由于子循环将包含更多的子循环,从而包含更多的子循环等等,因此无法根据该深度自动确定深度和循环


是否有一种迭代递归对象的方法?

如果父子树中没有循环,则可以使用简单的递归函数来确定子体的数量:

public class Item {
    ...

    public int getDescendantCount() {
        int count = 0;
        if (children != null) {
             count += children.size();
             for (Item child : children)
                  count += child.getDescendantCount();
        }
        return count;
    }
}

类似的东西

void read(Item item) {
    if (item == null) {
        //do something with the uuid ?
        return;
    } else {
        for (Item i : item.children) {
            read(i);
        }
    }
}

如果树很深,按照Eran的建议,使用呼吸优先搜索。如果树很宽,请使用深度优先搜索,该搜索可能类似于:

class ItemVisitor { 
    public void accept(Item item) {
        // Do something
        for (Item i : item.getChildren()) {
            this.accept(i);
        }
    }
}
编辑:

对于呼吸优先搜索,使用队列并将当前节点的所有子节点附加到该队列上

public void visitTree(Item head) {
    Queue<Item> queue = new PriorityQueue<Item>();
    while (queue.size() > 0) {
        Item curr = queue.poll();
        // Do something
        for (Item i : curr.getChildren())
            queue.add(i);
    }
}

如果您可以将深度存储为一个单独的数据项,并通过类设计/封装来实现它,那么您在这方面做得很好

你所建议的是一种深度不确定的树的节点。您可以实现任何常规的深度优先或广度优先搜索方法;在任何标准数据结构和算法教科书/web参考中查找它,并用Java实现。我打字时,Eran发布的解决方案是,如果使用堆栈后进先出或后进先出队列,则为标准的深度优先搜索;如果使用FIFO队列,则为广度优先搜索。这些都是好的、干净的方法,但不是最简单的

最天真的方法是一个简单的递归函数,用于深度优先搜索:

public void recurseIntoChildren(Item item) {
    if(item.children.size() == 0) {
        // you are now at a leaf node: do something
    }
    for(Item child : item.children) {
        recurseIntoChildren(child);
    }
}
此表单假定您希望在叶节点上执行某些操作。如果要搜索某个对象,可以让recurseIntoChildren在找到所需对象时返回一个特殊值,这样就可以中断所有其余的递归循环,让它返回null或其他值以指示循环应继续。如果你想采取其他行动,这取决于你的工作,以满足你的需要


除非编译器将尾部递归优化为一个简单的循环,否则这不是最有效的方法。

我不知道函数的确切目标是什么,但您始终可以通过子函数递归循环

比如说

 public void loopChildren(List<Item> items) {
     for (Item i : items) {
         System.out.println(i.uuid);
         loopChildren(i.children);           
     }       
 }
它只是一直循环,直到列表结束。若一个子项并没有子项,那个么列表应该是空的,这样它就会终止该迭代


希望这能有所帮助。

I OP已经有了一个项目的参考,为什么她需要这样一个按项目查找的东西?
 public void loopChildren(List<Item> items) {
     for (Item i : items) {
         System.out.println(i.uuid);
         loopChildren(i.children);           
     }       
 }