您的位置 首页 java

java 树结构4 获取当前节点所有父节点

有些业务场景下需要获取当前节点的父节点用于显示整个路径,或者判断当前节点是否在某一层的节点下面,如果我们可以拿到所有的父节点,那么其余的操作就很简单了。

下面写一种获取当前节点所有父节点的方式,当然没用递归的方式实现,一般能不用递归的实现的我都不会用递归。递归实现的,下一篇文章会写下。

话不多说,代码如下:

 #实体定义
@Data
class SysAreaVo {
     private  String areaCode;
    private String areaName;
    private String parentCode;
    private List<SysAreaVo> children;
}  
 #模拟数据
public  static  List<SysAreaVo> getAll() {
        List<SysAreaVo> list = new ArrayList<>();
        SysAreaVo a1 = new SysAreaVo();
        a1.setAreaCode("1");
        a1.setParentCode("0");
        a1.setAreaName("a1");
        list.add(a1);
        SysAreaVo b1 = new SysAreaVo();
        b1.setAreaCode("2");
        b1.setParentCode("0");
        b1.setAreaName("b1");
        list.add(b1);
        SysAreaVo a11 = new SysAreaVo();
        a11.setAreaCode("11");
        a11.setParentCode("1");
        a11.setAreaName("a11");
        list.add(a11);
        SysAreaVo a12 = new SysAreaVo();
        a12.setAreaCode("12");
        a12.setParentCode("1");
        a12.setAreaName("a12");
        list.add(a12);
        SysAreaVo b11 = new SysAreaVo();
        b11.setAreaCode("21");
        b11.setParentCode("2");
        b11.setAreaName("b21");
        list.add(b11);
        SysAreaVo a111 = new SysAreaVo();
        a111.setAreaCode("111");
        a111.setParentCode("11");
        a111.setAreaName("a111");
        list.add(a111);
        return list;
    }  
 #核心方法
public static List<SysAreaVo> getParents(String currentNodeId, List<SysAreaVo> all,  boolean  flag) {
        List<SysAreaVo> result = new ArrayList<>();
        if (all == null || all.isEmpty()) return result;
         Map <String, List<SysAreaVo>> map = all.stream().collect(Collectors.groupingBy(SysAreaVo::getParentCode));
        SysAreaVo current = all.stream().filter(f -> f.getAreaCode().equals(currentNodeId)).findFirst().get();
        if (flag) result.add(current);
        for (int i = 0; i < map.keySet().size(); i++) {
            SysAreaVo finalCurrent = current;
            List<SysAreaVo> list = all.stream().filter(f -> finalCurrent.getParentCode().equals(f.getAreaCode())).collect(Collectors.toList());
            if (list.size() > 0) {
                current = list.get(0);
                result.add(current);
            } else {
                continue;
            }
        }
        return result;
    }  
 #测试
public static  void  main(String[] args) {
        List<SysAreaVo> all = getAll();
        List<SysAreaVo> parents = getParents("111", all, true);
        System.out.println(parents);
         String  allNames = String.join("-->", parents.stream(). map (SysAreaVo::getAreaName).collect(Collectors.toList()));
        System.out.println(allNames);
    }  
 #测试结果:
[SysAreaVo(areaCode=111, areaName=a111, parentCode=11, children=null), 
 SysAreaVo(areaCode=11, areaName=a11, parentCode=1, children=null), 
 SysAreaVo(areaCode=1, areaName=a1, parentCode=0, children=null)]
a111-->a11-->a1  

当然要想获取节点id的话,map取一下就可以。

文章来源:智云一二三科技

文章标题:java 树结构4 获取当前节点所有父节点

文章地址:https://www.zhihuclub.com/179262.shtml

关于作者: 智云科技

热门文章

网站地图