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