java - 使用Java递归计算父子关系中文件夹中的消息数?
问题描述
每个Folder
都有列表,Messages
每个都Folder
可以有它的子Folders
列表和它自己的列表Messages
。我正在努力使用递归函数,该函数需要从传递给该函数Message
的任何节点返回对象计数。Folder
这是插入的类和一些虚拟日期以形成树。
如果我是正确的,这不像 Java 的文件和文件夹系统。这里,Message
cannot 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
被计算两次。我不知道为什么。我将不胜感激任何帮助。
解决方案
其实,就在刚才,我想出了这个。如果有人可以验证或尝试建议我如何改进它。
public static int numberOfMessages(Folder folder){
int count = 0;
for (Folder child : folder.getChildren()) {
count += numberOfMessages(child);
}
return count + folder.getMessages().size();
}
推荐阅读
- assembly - 链接描述文件有问题(未定义对“puts”的引用)
- javascript - JavaScript 克隆一个内部有循环的元素
- javascript - 隐藏基于使用纯 JavaScript 的类的 href 元素在 Chrome 中不起作用
- javascript - RXJS - 如何订阅多次
- sql - SQL Server - 检索编码错误的数据
- java - 如何使用 Spring Boot 在 Spring Security 中动态更改 client_secret
- ios - 当 FirebaseDeepLinkAutomaticRetrievalEnabled 设置为 NO 时如何手动检索待处理的 Firebase 动态链接
- bash - 比较具有多列的 2 个文件 | 壳
- laravel - Laravel Nova 中的自引用多对多关系
- c++ - C++ 与线程并行处理向量的每个元素