树型结构数据的处理----递归方法

前言

一、树状结构数据的展示(一般selectAll方法)

二、根据层级数据中的某一条数据的id去获取其所有子类数据的id

总结


前言

一般在实际项目中我们都会遇到层级形式的数据,而且在项目中经常需要将此类数据以树状形式展示出来,不仅如此,还需要对其进行各种处理,这篇文章就来总结一下对层级数据的各种处理操作吧


一、树状结构数据的展示(一般selectAll方法)

1、思路:首先找到最外层的数据,一般默认其parentId为0,在根据下一级的parentId等于最外层数据的Id,我一般喜欢使用stream流来写一个递归方法。

   /**
     *  写一个递归的方法 获取每一个组织机构的子组织
     */
    private List getChildren(Organization parent,List all){
        List children = all.stream().filter(organization -> {
            return organization.getParentId().equals(parent.getId());
        }).map(organization -> {
//            找到子菜单
            organization.setChildren(getChildren(organization,all));
            return organization;
        }).sorted((menu1,menu2)->{
//            菜单排序
            return (menu1.getSort()==null?0:menu1.getSort()) - (menu2.getSort()==null?0:menu2.getSort());
        }).collect(Collectors.toList());
        return children;
    }

再写一个查询所有的方法,先找出一级数据,然后调用上面的递归方法,依次找出子类数据,设置进上级数据的children属性中

  @Override
    public List selectAll() {
//1.查询出所有实体类分类
        List organizations = organizationMapper.selectList(null);
//2.组装成父子分类的树型结构数据
//        2.1找到所有一级分类数据
        List level1 = organizations.stream().filter(organization ->
            organization.getParentId()==0//过滤出一级分类数据
        ).map((menu)->{
            menu.setChildren(getChildren(menu,organizations));//利用递归方法找到其子类组织机构
            System.out.println(getChildren(menu,organizations));
            return menu;
        }).sorted((menu1,menu2)->{
            return (menu1.getSort()==null?0:menu1.getSort()) - (menu2.getSort()==null?0:menu2.getSort());//排序
        }).collect(Collectors.toList());
        System.out.println(level1);
        return level1;

二、根据层级数据中的某一条数据的id去获取其所有子类数据的id

在不知道层级数的情况下还是需要一个递归方法来解决,在项目业务会遇到的场景一般在修改或者删除里面有,我就选取一个删除模块的代码说一下思路:获取一条数据id,删除它并且删除其所有的子数据。

代码思路如下

 @Override
    public void deleteById(Long id) throws SystemException {
        //存储所有需要删除的节点id
        ArrayList idList = new ArrayList<>();
        //获得所有需要删除的id
        this.selectChildListById(id, idList);
        //添加删除的节点id
        idList.add(String.valueOf(id));
        //MybatisPlus批量删除方法
        organizationMapper.deleteBatchIds(idList);
    }

写一个获取所有子类数据id的递归方法

  private String selectChildListById(Long id, List idList) {
        //查询数据库pid等于id的数据
        List childList = organizationMapper.selectList(new QueryWrapper().eq("parent_id", id).select("id"));
        //递归查询下一级id,同时将上一次查询结果添加到list集合
        childList.forEach(organization-> {
           idList.add(String.valueOf(organization.getId()));
            this.selectChildListById(organization.getId(), idList);
        });
        return null;
    }


总结

后续还有对树状型结构数据的处理,我会继续更新到此篇文章当中,觉得有用可以收藏或点赞,也可以一起讨论

你可能感兴趣的:(java,开发语言,mybatis)