java 使用递归算法快速封装树形结构(简单易懂)

java 使用递归算法快速封装树形结构(简单易懂)

在日常的搬砖生活中,会无法避免的遇到各种各样的Tree,列如:导航栏,组织机构等等。这些数据通常是存储在数据库中,通过parent_id,id进行层级关联,那么如何将这些数据重新封装成Tree结构呢?这里做一个简单的分享。

1,创建实体类

@Data
@ToString
public class CatalogVO  {
    private Integer id;
    private Integer panelsId;
    private String catalogName;
    private Integer parentId;
    private Integer isDeleted;
    private String createdUser;
    private Date createdTime;
    List<CatalogVO> chirldren = new ArrayList<>();
}

创建一个实体类CatalogVO,在实体类中创建一个List 对象,用它来接收chirldren(子节点),并且引入自身作为泛型,如下图箭头处。
在这里插入图片描述

2,数据库结构

在这里插入图片描述
通过数据库结构可以看出,这里我只是简单的使用parent_id 和 id 进行层级关联。

3,service层

从数据库读取数据,然后使用递归算法将原始数据进行重新封装。

 /**
     * 获取文档目录的树形结构
     * @param panelsId
     * @return
     */
    @Override
    public List<CatalogVO> getDetailTree(int panelsId) {
        QueryWrapper<FileCatalog> wrapper = new QueryWrapper<>();
        wrapper.eq("panels_id", panelsId);
        List<FileCatalog> fileCatalogs = fileCatalogMapper.selectList(wrapper);
        List<CatalogVO> lists = new ArrayList<>();
        for (FileCatalog fileCatalog : fileCatalogs) {
            CatalogVO vo = new CatalogVO();
            try {
                BeanUtils.copyProperties(vo,fileCatalog);
                lists.add(vo);
            } catch (IllegalAccessException | InvocationTargetException e) {
                e.printStackTrace();
            }
        }
        List<CatalogVO> tree = createTree(lists, 0);
        return tree;
    }

    /**
     * 递归建立树形结构 (算法)
     * @param lists
     * @param pid
     * @return
     */
    private List<CatalogVO> createTree(List<CatalogVO> lists, int pid) {
        List<CatalogVO> tree = new ArrayList<>();
        for (CatalogVO catelog : lists) {
            if (catelog.getParentId() == pid) {
                catelog.setChirldren(createTree(lists,catelog.getId()));
                tree.add(catelog);
            }
        }
        return tree;
    }

在这里插入图片描述

4,前台请求

在这里插入图片描述
可以看到,数据已经封装成功,并且正是我所需要的Tree结构。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值