Tree树状结构转list,获取从根节点到叶子节点中,每条路径上的所有集合

Tree对象结构:

public class B {
     private Integer id;
     private String label;
     private Integer nodeType;
     private List<B> children; //关键字段

     public Integer getId() { return id; }

     public void setId(Integer id) { this.id = id; }

     public String getLabel() { return label; }

     public void setLabel(String label) { this.label = label; }

     public Integer getNodeType() { return nodeType; }

     public void setNodeType(Integer nodeType) { this.nodeType = nodeType; }

     public List<B> getChildren() {
          return children;
     }

     public void setChildren(List<B> children) {
          this.children = children;
     }
}

方法:

注:结构必须为B类结构样式

/**
 * 迭代获取所有List集合
 * @param list  Tree型数据,
 * @param results 从根节点到当前data节点的 B 对象的集合(results集合中的所有children都为null)
 * @return
 */
private List<List<B>> recursiveList(List<B> list, List<B> results) {
    //声明返回对象
    List<List<B>> listList = new ArrayList<>();
    if (StringUtils.isNotEmpty(list)) {
        for (B tree : list) {
            //声明一个List,用来存放从根节点到当前节点 这一条路径上的B对象
            List<B> treeVOList = new ArrayList<>();
            treeVOList.addAll(results);//将前面路径上的B对象添加进 List
            B treeVO = new B();
            //把tree复制到treeVO
            BeanUtils.copyProperties(tree, treeVO);
            treeVO.setChildren(null);//把treeVO中的children赋值为null,tree中的不变
            treeVOList.add(treeVO);//将不包含children属性的临时对象放进 treeVOList

            //treeVOList 中已经保存完整了从根到当前节点一整条路径上的所有B对象了。
            //检查当前节点B对象的children属性,如果children为空,则表示当前节点为叶子节点,
            if (StringUtils.isEmpty(tree.getChildren())) {
                listList.add(treeVOList);
            } else {//不为空,说明当前节点不是叶子节点,把treeVOList传递给下一轮进行迭代
                List<List<B>> recursiveList = recursiveList(tree.getChildren(), treeVOList);
                //迭代结束对返回数据 recursiveList 进行追加保存,确保不会丢失
                listList.addAll(recursiveList);
            }
        }
    }
    return listList;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值