查找n个嵌套列表中的元素,并按特定属性删除



我正试图从一个主要对象中找到并删除一定数量的sub//sub/sub/..(未知嵌套级别)元素。我的情况是这样的:

根对象:

public class Root {
public int id;
public int type;
public String name;
public List<Son> sons;
....
}

主对象(根)有一个子对象列表,可以有N个嵌套的子对象列表。对象共享相同的3个变量名称,如root,以及其他属性。因为我不知道嵌套有多深,我试图找到一种方法来找到这个嵌套的Son对象,我想要删除的多个元素匹配指定的属性(int type==1)。

我已经尝试过流,但也许我没有足够的能力在代码上适合正确的命令。像这样:

List<Son> firstNode = root.getSons();
firstNode.stream()
.forEach(c -> {
if(c.geType()==1){
firstNode.remove(c);
logger.info("###############################>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"+c.getName());
}
});

但是,这行不通。

我也尝试了一段时间,计算对象的最深节点,但节点可能因子节点而异。

有什么建议吗?

为了让你更好地理解这种情况,我做了一个关于对象可能是什么以及类型==1在哪里的图表:https://i.stack.imgur.com/gGc2g.png

好的,试试这个。我必须做一些假设。它将删除给定类型的所有内容,除了根。此外,您应该将根创建为Son的一个实例,这样才能正常工作。你真的不需要一个单独的根类。

只需用Son的根实例和要删除的类型调用它。

public static void remove(Son son, int type) {  
if (son == null) {
return;
}
Iterator<Son> iter = son.sons.iterator();
while(iter.hasNext()) {
Son s = iter.next();
if (s.type == type) {
iter.remove();
} else {
if (s.sons != null) {
remove(s, type);
}
}
}
}

因为这个数字是未知的,所以需要使用递归方法访问所有的树。

递归是一种调用函数本身的技术。这种技术提供了一种把复杂问题分解成更容易解决的简单问题的方法。

你需要先修复一个返回条件:例如if (listOfSon.isEmpty()) return;

然后您需要执行业务逻辑。之后,该方法需要为所有的子节点调用自己,这样您就可以保证您的方法将访问所有存在的节点。

你可以在java中搜索递归,遍历java中树的所有节点. 这会让你很清楚自己需要什么

您可以将类Node更改为从类Root扩展为了避免写入另一个条件

static void removeNode(Root r) {
if (r.sons!=null && !r.sons.isEmpty()) {
for (Son s : r.sons) {
if (s.type == 1) {
removeNode(s);
}
}
for (Son s : r.sons) {
if (s.type == 1) {
r.sons.remove(s);
}
}
}
}

当迭代ArrayList时,要小心从ArrayList中删除元素,因为它可能导致ConcurrentModificationException。