用递归实现构造目录树

目前有一张目录表:CATALOGS,存放目录,目录有多个级别,如根目录,一级目录,二级目录等。二级目录的父级id等于一级目录的id,以此关联。
另外一张表是业务数据表:SHARES,有一个字段catalogId来存放目录id
需要展示所有的数据,并且返回相应的目录层级
如下图:
在这里插入图片描述
实现思路:
首先第一步:查询出所有的SHARES,然后再获取到SHARES所在的目录,拿到这些目录id后,再遍历查询数据库,获取到所有涉及的目录信息。
然后再组装树结构。
上代码:

//目录类
public class CatalogVo {

  //父级id
    private String tmpParentCatalogId;
    //id
    private String editContentId;
    //目录名
    private String tmpCatalogName;
    //排序
    private String sortNumber;
}
//业务数据类
public class DghyYjhcHcxShare implements Serializable {
    @TableId(value = "ID")
    @ApiModelProperty("主键")
    private Long id;
    @ApiModelProperty("图层id")
    private String tcId;
    @ApiModelProperty("目录主键")
    @TableField(exist = false)
    private String catalogId;
  
    private static final long serialVersionUID = 1L;


}

关键代码:递归查询所有父级目录,直到查询到根目录

  /**
     * 查找所有的父级目录
     *
     * @param catalogAll
     * @param plist
     */
    private void getParentCatalog(List<CatalogVo> catalogAll, List<CatalogVo> plist) {
        for (CatalogVo catalogVo : plist) {
            //一级菜单父id为0
            if (!"0".equals(catalogVo.getTmpParentCatalogId())) {
                List<CatalogVo> list = dghyYjhcHcxShareMapper.getCatalogs(null, catalogVo.getTmpParentCatalogId());
                catalogAll.addAll(list);
                getParentCatalog(catalogAll, list);

            }
        }
    }

组装树结构:
先找根节点,然后往下一次组装字节点:

 private List getTree(List<CatalogVo> catalogAll, List<DghyYjhcHcxShare> sharesAll) {
        //先拿出根节点:即父级id为0的数据
        Optional<CatalogVo> root = catalogAll.stream().filter(i -> "0".equals(i.getTmpParentCatalogId())).findFirst();
        if (root.isPresent()) {
            CatalogVo rootVo = root.get();
            String id = rootVo.getEditContentId();
            List list = getchild(id, catalogAll, sharesAll, new ArrayList<>());
            return list;
        }
        return null;
    }




/**
     * 获取当前父id的所有子节点
     *
     * @param id         父id
     * @param catalogAll 所有目录
     * @param sharesAll  所有图层
     * @return {@link List}
     */
    private List getchild(String id, List<CatalogVo> catalogAll, List<DghyYjhcHcxShare> sharesAll, List<DghyYjhcHcxShare> isAddShare) {
        List ret = new ArrayList();

        //看有哪些子目录
        List<CatalogVo> childCatalog = catalogAll.stream().filter(i -> id.equals(i.getTmpParentCatalogId())).collect(Collectors.toList());
        if (CollectionUtils.isNotEmpty(childCatalog)) {
            for (CatalogVo catalogVo : childCatalog) {
                Map<String, Object> map = new HashMap<>();
                //目录
                map.put("types", 0);
                map.put("shares", "1");
                map.put("id", catalogVo.getEditContentId());
                map.put("treeid", "0_" + catalogVo.getEditContentId());
                map.put("pid", catalogVo.getTmpParentCatalogId());
                map.put("name", catalogVo.getTmpCatalogName());
                map.put("label", catalogVo.getTmpCatalogName());
                map.put("text", catalogVo.getTmpCatalogName());
                map.put("sort", catalogVo.getSortNumber());
                map.put("children", getchild(catalogVo.getEditContentId(), catalogAll, sharesAll, isAddShare));
                ret.add(map);
            }


        }
        List<DghyYjhcHcxShare> childTxs = sharesAll.stream().filter(i -> id.equals(i.getCatalogId())).collect(Collectors.toList());
        if (CollectionUtils.isNotEmpty(childTxs)) {
            for (int i = 0; i < childTxs.size(); i++) {
                DghyYjhcHcxShare tx = childTxs.get(i);
                JSONObject item = JSONObject.parseObject(JSONObject.toJSONString(tx));
                item.put("types", 1);
                item.put("shares", "1");
                item.put("id", tx.getId());
                item.put("treeid", "0_" + tx.getId());
                item.put("pid", tx.getCatalogId());
                item.put("name", tx.getGraphName());
                item.put("label", tx.getGraphName());
                item.put("text", tx.getGraphName());
                item.put("sort", i);
                item.put("tcid", tx.getTcId());
                ret.add(item);
                isAddShare.add(tx);
            }
        }
        return ret;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值