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

你的名字 2024-04-08 09:30 156阅读 0赞

目录

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实体类

  1. /**
  2. * @author W
  3. * @createDate 2022/8/10
  4. * @description: Dept实体类
  5. */
  6. @Data
  7. @AllArgsConstructor
  8. @NoArgsConstructor
  9. public class Dept {
  10. private String id;
  11. private String name;
  12. private String parentId;
  13. private List<Dept> children = new ArrayList<>(); // 可不要
  14. }

2.2 相关树形结构

42676a783eca498cb49f00ae32a27746.png

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

3.1 service层

  • 方法一:根据根节点的parentId=”0”进行判断递归

    /**

    1. * 根据子节点获取最上层节点
    2. * @param deptAll 所有部门集合
    3. * @param deptChild 子节点
    4. * @return
    5. */
    6. public static Dept getMaximumParent(List<Dept> deptAll, Dept deptChild){
    7. Dept dept = null;
    8. String parentId = deptChild.getParentId();
    9. if(parentId.equals("0")){
    10. dept = deptChild;
    11. }else {
    12. List<Dept> parent = deptAll.stream().filter(item -> item.getId().equals(parentId)).collect(Collectors.toList());
    13. Dept maximumParent = getMaximumParent(deptAll, parent.get(0));
    14. dept = maximumParent;
    15. }
    16. return dept;
    17. }
  • 方法二:递归至上层节点为 null 返回入参的子节点数据为根节点

    /**

    1. * 根据子节点获取最上层节点
    2. * @param deptAll 所有部门集合
    3. * @param deptChild 子节点
    4. * @return
    5. */
    6. public static Dept getMaximumParent2(List<Dept> deptAll, Dept deptChild) {
    7. if(ObjectUtil.isNotEmpty(deptChild)){
    8. String parentId = deptChild.getParentId();
    9. List<Dept> parentDepts = deptAll.stream().filter(item -> item.getId().equals(parentId)).collect(Collectors.toList());
    10. if(CollectionUtil.isNotEmpty(parentDepts)){
    11. Dept parentDept = parentDepts.get(0);
    12. Dept maximumParent2 = getMaximumParent2(deptAll, parentDept);
    13. if(maximumParent2==null){
    14. return parentDept;
    15. }
    16. return maximumParent2;
    17. }
    18. }
    19. return null;
    20. }

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

39bb1b98f6ac4b4ba995d981a617228d.png

报错信息,如下:

cc890a9118934213b67b378c4b81864b.png

3.2 controller层

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

3.3 测试

2c52a1d56bbe41a2b4922faf49fc34cf.png

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

4.1 service层

  1. /**
  2. * 向上查询所有上级
  3. * @param deptAll 所有集合
  4. * @param leafNodeDept 叶子节点
  5. */
  6. public static Set<Dept> getDeptUpList(List<Dept> deptAll,Dept leafNodeDept){
  7. if(ObjectUtil.isNotEmpty(leafNodeDept)){
  8. Set<Dept> set = new HashSet<>();
  9. String parentId = leafNodeDept.getParentId();
  10. List<Dept> parentDepts = deptAll.stream().filter(item -> item.getId().equals(parentId)).collect(Collectors.toList());
  11. if(CollectionUtil.isNotEmpty(parentDepts)){
  12. Dept parentDept = parentDepts.get(0);
  13. set.add(parentDept);
  14. Set<Dept> deptUpTree = getDeptUpList(deptAll, parentDept);
  15. if(deptUpTree!=null){
  16. set.addAll(deptUpTree);
  17. }
  18. return set;
  19. }
  20. }
  21. return null;
  22. }

4.2 controller层

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

4.3 测试

e9c4a4e5147a44efa2bf6d0887556a90.png

发表评论

表情:
评论列表 (有 0 条评论,156人围观)

还没有评论,来说两句吧...

相关阅读