首页 > 解决方案 > 使用Java递归计算父子关系中文件夹中的消息数?

问题描述

每个Folder都有列表,Messages每个都Folder可以有它的子Folders列表和它自己的列表Messages。我正在努力使用递归函数,该函数需要从传递给该函数Message的任何节点返回对象计数。Folder这是插入的类和一些虚拟日期以形成树。

如果我是正确的,这不像 Java 的文件和文件夹系统。这里,Messagecannot be 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's Message被计算两次。我不知道为什么。我将不胜感激任何帮助。

标签: javarecursiondirectorytree

解决方案


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

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

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

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

推荐阅读