Рекурсивный расчет количества сообщений в папках в родительско-дочерних отношениях с использованием Java? - PullRequest
0 голосов
/ 12 апреля 2020

Каждый Folder имеет список Messages, а каждый Folder может иметь список своих дочерних элементов Folders и собственный список Messages. Я борюсь с функцией рекурсии, которая должна возвращать количество Message объектов из любого узла Folder, который передается этим функциям. Вот классы и некоторые фиктивные даты, вставленные в дерево.

Если я прав, это не похоже на систему файлов и папок Java. Здесь Message не может быть Folder, поэтому нет Java s 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 с любого уровня между листом и root, я получу правильный результат. Я также попытался с помощью отладчика, медленно писать фреймы стека, как из лекций. Но, похоже, я не могу обдумать это.

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 подсчитывается два раза. Я не знаю почему. Буду признателен за любую помощь.

1 Ответ

0 голосов
/ 12 апреля 2020

На самом деле, только сейчас я придумал это. Если кто-то может проверить или попытаться предложить мне, как улучшить это.

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

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

    return count + folder.getMessages().size();
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...