Java根据子节点获取最上层节点(根节点)数据和所有上级集合

目录

1 通过递归获取树形结构、通过父节点获取最底层节点(叶子节点)数据、树形XML,可以参考以下内容:

2 实体和数据结构

2.1 Dept实体类

2.2 相关树形结构

3 根据子节点获取最上层节点(根节点)数据

3.1 service层

3.2  controller层

3.3 测试 

4 根据子节点获取所有上级集合

4.1 service层

4.2 controller层

4.3 测试


1 通过递归获取树形结构、通过父节点获取最底层节点(叶子节点)数据、树形XML,可以参考以下内容:

Java树形结构 根据父节点获取最底层节点数据 树形xml_www_48568302的博客-CSDN博客

2 实体和数据结构

2.1 Dept实体类

/**
 * @author W
 * @createDate 2022/8/10
 * @description: Dept实体类
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Dept {
    private String id;
    private String name;
    private String parentId;
    private List<Dept> children = new ArrayList<>(); // 可不要
}

2.2 相关树形结构

3 根据子节点获取最上层节点(根节点)数据

3.1 service层

  • 方法一:根据根节点的parentId="0"进行判断递归
 /**
     * 根据子节点获取最上层节点
     * @param deptAll 所有部门集合
     * @param deptChild 子节点
     * @return
     */
    public static Dept getMaximumParent(List<Dept> deptAll, Dept deptChild){
        Dept dept = null;
        String parentId = deptChild.getParentId();
        if(parentId.equals("0")){
            dept = deptChild;
        }else {
            List<Dept> parent = deptAll.stream().filter(item -> item.getId().equals(parentId)).collect(Collectors.toList());
            Dept maximumParent = getMaximumParent(deptAll, parent.get(0));
            dept = maximumParent;
        }
        return dept;
    }
  • 方法二:递归至上层节点为 null 返回入参的子节点数据为根节点
    /**
     * 根据子节点获取最上层节点
     * @param deptAll 所有部门集合
     * @param deptChild 子节点
     * @return
     */
    public static Dept getMaximumParent2(List<Dept> deptAll, Dept deptChild) {
        if(ObjectUtil.isNotEmpty(deptChild)){
            String parentId = deptChild.getParentId();
            List<Dept> parentDepts = deptAll.stream().filter(item -> item.getId().equals(parentId)).collect(Collectors.toList());
            if(CollectionUtil.isNotEmpty(parentDepts)){
                Dept parentDept = parentDepts.get(0);
                Dept maximumParent2 = getMaximumParent2(deptAll, parentDept);
                if(maximumParent2==null){
                    return parentDept;
                }
                return maximumParent2;
            }
        }
        return null;
    }

踩坑,通过索引获取空集合元素,会报IndexOutOfBoundsException下标越界异常,代码如下:

 报错信息,如下:

3.2  controller层

@GetMapping("/getMaximumParent2")
public ResponseResult getMaximumParent2(){
    List<Dept> deptAll = GetLeafNode.getDeptAll(); // 所有部门集合
    Dept leafNodeDept = new Dept("322","四层8","32",null);
    Dept deptRoot = GetLeafNode.getMaximumParent2(deptAll, leafNodeDept);
    return ResponseResult.success("根据子节点获取根节点",deptRoot);
}

3.3 测试 

4 根据子节点获取所有上级集合

4.1 service层

/**
 * 向上查询所有上级
 * @param deptAll 所有集合
 * @param leafNodeDept 叶子节点
 */
public static Set<Dept> getDeptUpList(List<Dept> deptAll,Dept leafNodeDept){
    if(ObjectUtil.isNotEmpty(leafNodeDept)){
        Set<Dept> set = new HashSet<>();
        String parentId = leafNodeDept.getParentId();
        List<Dept> parentDepts = deptAll.stream().filter(item -> item.getId().equals(parentId)).collect(Collectors.toList());
        if(CollectionUtil.isNotEmpty(parentDepts)){
            Dept parentDept = parentDepts.get(0);
            set.add(parentDept);
            Set<Dept> deptUpTree = getDeptUpList(deptAll, parentDept);
            if(deptUpTree!=null){
                set.addAll(deptUpTree);
            }
            return set;
        }
    }
    return null;
}

4.2 controller层

@GetMapping("/getDeptUpList")
public ResponseResult getDeptUpTree(){
    List<Dept> deptAll = GetLeafNode.getDeptAll(); // 所有部门集合
    Dept leafNodeDept = new Dept("322","四层8","32",null);
    Set<Dept> deptUpTree = GetLeafNode.getDeptUpList(deptAll, leafNodeDept);
    return ResponseResult.success("根据子节点查出的所有上级",deptUpTree);
}

4.3 测试

猜你喜欢

转载自blog.csdn.net/weixin_48568302/article/details/126386503