【问题标题】:Calculating number of Messages in Folders in a parent-child relationship recursively using Java?使用Java递归计算父子关系中文件夹中的消息数?
【发布时间】:2020-07-25 00:24:51
【问题描述】:

每个Folder 都有Messages 的列表,每个Folder 可以有它的子列表Folders 和它自己的Messages 列表。我正在努力使用递归函数,该函数需要从传递给该函数的任何节点 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's Message 被计算两次。我不知道为什么。我将不胜感激。

【问题讨论】:

    标签: java recursion directory tree


    【解决方案1】:

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

    public static int numberOfMessages(Folder folder){
        int count = 0;
    
        for (Folder child : folder.getChildren()) {
            count += numberOfMessages(child);
        }
    
        return count + folder.getMessages().size();
     }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多