java - 使用Java递归计算父子关系文件夹中的消息数?

标签 java recursion directory tree

每个文件夹都有消息列表,每个文件夹可以有其子文件夹列表和列表它自己的消息。我正在努力解决递归函数,它需要从传递给该函数的任何节点 Folder 返回 Message 对象的计数。这里有类和一些插入的虚拟日期以形成一棵树。

如果我是对的,这与 Java 的文件和文件夹系统不同。这里,Message不能是Folder,因此不存在Java的isDirectory()

    public class Folder {

        private Folder parent;
        private ArrayList<Message> mMessages;
        private ArrayList<Folder> children;

        public Folder(){
            this(null, new ArrayList<Folder>(), new ArrayList<Message>());
        }


        public Folder(Folder parent, ArrayList<Folder> children) {
            this.parent = parent;
            this.children = children;
        }

        public Folder(Folder parent, ArrayList<Folder> childrens, ArrayList<Message> messages ) {
            this.parent = parent;
            this.children = childrens;
            this.mMessages = messages;
        }
        public boolean hasChildren(){
            return this.getChildren().size() > 0;
        }

        public void addChildren(Folder child) {
            child.setParent(this);
            this.getChildren().add(child);
        }

        public void addMessage(Message message) {
            this.getMessages().add(message);
        }

        public boolean isRoot() {
            return parent == null;
        }
}

以下是虚拟数据:

Message m1 = new Message();
    Message m2 = new Message();
    Message m3 = new Message();


    //main root
    Folder root = new Folder();

    //root's folder children
    Folder level1a = new Folder();  level1a.addMessage(m1);
    Folder level1b = new Folder();  level1b.addMessage(m2);
    Folder level1c = new Folder();  level1c.addMessage(m3);

    //adding children to root
    root.addChildren(level1a); root.addChildren(level1b); root.addChildren(level1c);


    //adding children to level 1a
    Folder level1aa = new Folder(); 
    level1a.addChildren(level1aa);

    //adding messages to level 1aaa and 1aab
    Folder level1aaa = new Folder(); level1aaa.addMessage(new Message());
    Folder level1aab = new Folder(); level1aab.addMessage(new Message());

    //adding children (level1aaa and level1aab) to its parent level1aa
    level1aa.addChildren(level1aaa);
    level1aa.addChildren(level1aab);

这就是我所拥有的。这是不正确的,每添加一个新级别,如果将 root 传递给函数,我就会多获得一个额外的 count 。但是,如果我从叶和根之间的任何级别传递一些节点 Folder ,我会得到正确的结果。我还尝试使用调试器,慢慢地,像讲座中那样编写堆栈帧。但我似乎无法全神贯注于此。

public static int numberOfMessages(Folder folder){
    int count = 0;

    count+= folder.getMessages().size();

    for (Folder child : folder.getChildren()) {
        if (child.hasChildren()) {

            count += numberOfMessages(child);
        }
        count += child.getMessages().size();
    }

    return count;
 }

据我所知,当它开始返回调用时,level1a 的 Message 似乎被计数了两次。我不知道为什么。我将不胜感激任何帮助。

最佳答案

其实我刚才就想到了这个。如果有人可以验证或尝试建议我如何改进它。

public static int numberOfMessages(Folder folder){
    int count = 0;

    for (Folder child : folder.getChildren()) {
        count += numberOfMessages(child);
    }

    return count + folder.getMessages().size();
 }

关于java - 使用Java递归计算父子关系文件夹中的消息数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61171036/

相关文章:

c++ - 模板:递归直到推导出适当的参数

c++ - 从文件名中获取目录名

python - 使用 Python 在 Mac OSX 中转义正斜杠路径目录?

java - 单例设计模式与 Spring 容器中的单例 bean

在 Applet 中执行操作后 Java JDBC 连接丢失

java - 我可以从递归返回到 main 而不展开堆栈吗?

java - 通过java在JCR repo中进行递归搜索

java - 为什么在这种情况下 subpath() 会抛出 IllegalArgumentException ?

java - 为什么我的缓冲图像不显示在我的 JPanel 中?

java - PyLucene org.apache.lucene.benchmark 丢失