有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在nTested列表中查找元素并按特定属性删除

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

根对象:

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

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

我尝试过使用stream,但可能我没有足够的能力在代码中安装正确的命令。 大概是这样的:

List<Son> firstNode = root.getSons();

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

然而,这不起作用

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

有什么建议吗

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


共 (2) 个答案

  1. # 1 楼答案

    好的,试试这个。我不得不做出一些假设。它将删除除根之外的所有给定类型。此外,您应该使根成为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);
               }
            }
        }
    }
    
  2. # 2 楼答案

    因为数字未知,所以需要使用递归方法来访问所有树

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

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

    然后你需要做你的业务逻辑。 在此之后,该方法需要为所有子节点调用自身,就像您保证您的方法将访问所有现有节点一样

    您可以搜索:java中的递归,遍历java中树的所有节点。这会给你一个关于你需要什么的好主意

    您可以将类节点更改为从类根扩展而来,以避免写入其他条件

      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