美文网首页
java 数据库树形结构的各种取值

java 数据库树形结构的各种取值

作者: 小学生课代表 | 来源:发表于2021-01-07 19:15 被阅读0次

数据库中存的数据结构:id和parent_id


image.png

需求:

  1. 得到一个树形结构的json数据
  2. 自定义获取到某一级,得到树形结构的json数据(有些只创建到了第二级,但想获得到第四级的树,需要将不到第四级的排除掉)
  3. 将name按照对应任意层级拼接(ex:一级/二级/三级/四级)
  • 实现需求一:
//数据库中取出所有list
List<TreeVo> treeVos = treeMapper.selectTree();
Map<Long, TreeVo> treeVoMap = treeVos.stream()
                                     .collect(Collectors.toMap(TreeVo::getId, e -> e));
treeVos.stream().forEach(e->{
     if (treeVoMap.containsKey(e.getParentId())&& e.getParentId() != 0){
            TreeVo parentVo = treeVoMap.get(e.getParentId() );
             if (parentVo.getChildVOs() == null){
                parentVo.setChildVOs(new ArrayList<>());
             }
             parentVo.getChildVOs().add(e);
         }
    });
 List<TreeVo> collect = treeVoMap.values().stream()
                                 .filter(e -> e.getParentId() == 0)
                                 .collect(Collectors.toList());
  • 实现需求二:
public List<TreeVo> selectValidTree(Integer maxLev){
        List<TreeVo> treeVos = treeMapper.selectTree();
        Map<Long, TreeVo> treeVoMap = treeVos.stream()
                                      .collect(Collectors.toMap(TreeVo::getId, e -> e));
        //得到最后一级的map(key:父级id;value:子的集合),依次向上查找
        Map<Long, List<TreeVo>> map = new HashMap<>();
        for (TreeVo vo: treeVos) {
            if (vo.getLevel() == maxLev){
                if (!map.containsKey(vo.getParentId())){
                    map.put(vo.getParentId(),new ArrayList<>());
                }
                map.get(vo.getParentId()).add(vo);
            }
        }
        if (!map.isEmpty()) {
            //通过递归向上查找
            Map<Long, List<TreeVo>> map2 = recursionFindUp(treeVoMap, map);
            return  map2.get(0L);
        }
        return null;
    }


/**
     * @Description: 筛选层级不足四级的视频分类(从下到上)
     * @Param:  mapAll:所有数据的map,orderMap:结果map
     * @return:
     */
    public Map<Long, List<TreeVo>> recursionFindUp(
                                        Map<Long, TreeVo> treeVoMap,
                                        Map<Long, List<TreeVo>> orderMap){
        if (orderMap.keySet().stream().findFirst().get()==0 ){//找到了最上级
            return orderMap;
        }else {
            Map<Long, List<TreeVo>> tempOrderMap = new HashMap<>();
            orderMap.forEach((key,value)->{
                if (treeVoMap.containsKey(key)){
                    //找到父级
                    TreeVo allVO = treeVoMap.get(key);
                    //将子的集合放到此父级中
                    allVO.setChildVOs(value);
                    //找到父级的父级
                    if (!tempOrderMap.containsKey(allVO.getParentId())){
                        tempOrderMap.put(allVO.getParentId(),new ArrayList<>());
                    }
                    tempOrderMap.get(allVO.getParentId()).add(allVO);
                }
            });
            return recursionFindUp(treeVoMap,tempOrderMap);
        }
    }

结果与需求一差不多,只是排除了不够级别的数据

  • 实现需求三:
 /**
     * @Description: 得到视频分类的选项列表
     * @Param: type 视频分类类别,maxLev查询的最大级别
     * @return:
     */
    public List<TreeOptionVo> getOptionsList( Integer maxLev) {
        //@Select("select id , parent_id AS 'parentId' , name , level , del from rv_video_category where del=0 and level <= #{maxLev}")
        List<TreeVo> treeVos = treeMapper.selectTreeOptionByMaxLev(maxLev);
        Map<Long, TreeVo> treeVoMap = treeVos.stream().collect(Collectors.toMap(TreeVo::getId, e -> e));
        treeVos.stream().forEach(e->{
            if (treeVoMap.containsKey(e.getParentId()) && e.getParentId() != 0){
                TreeVo parentVo = treeVoMap.get(e.getParentId() );
                if (parentVo.getChildVOs() == null){
                    parentVo.setChildVOs(new ArrayList<>());
                }
                parentVo.getChildVOs().add(e);
            }
        });
        List<TreeVo> collect = treeVoMap.values().stream().filter(e -> e.getParentId() == 0).collect(Collectors.toList());
        //以上跟实现一步骤一样,搜索条件增加了一个level <= #{maxLev}。只是没单独抽离出来
        List<TreeOptionVo> list = new ArrayList<>();
        for (TreeVo vo : collect) {
            TreeOptionVo optionVO = new TreeOptionVo();
            optionVO.setName(vo.getName());
            optionVO.setMaxLevel(vo.getLevel());
            treeOption(vo.getChildVOs(), list, optionVO, maxLev);
        }
        return  list;
    }
    /**
     * @Description: 通过拼接得到对象的测试方法
     * @Param:
     * @return:
     */
    public void treeOption(
                  List<TreeVo> allVOS,
                  List<TreeOptionVo> list, 
                  TreeOptionVo node, Integer maxLev) {
        if (allVOS == null) {
            if (node.getMaxLevel().equals(maxLev)) {
                list.add(node);
            }
        } else {
            for (TreeVo vo : allVOS) {
                Integer currentLevel = node.getMaxLevel();
                if (vo.getChildVOs() == null) {
                    if (currentLevel == maxLev - 1) {
                        TreeOptionVo optionVO = new TreeOptionVo();
                        optionVO.setName(node.getName().concat("/" + vo.getName()));
                        list.add(optionVO);
                    }
                } else {
                    TreeOptionVo temp = new TreeOptionVo();
                    temp.setName(node.getName().concat("/" + vo.getName()));
                    temp.setMaxLevel(vo.getLevel());
                    treeOption(vo.getChildVOs(), list, temp, maxLev);
                }
            }
        }
    }

结果:


image.png

相关文章

  • java 数据库树形结构的各种取值

    数据库中存的数据结构:id和parent_id 需求: 得到一个树形结构的json数据 自定义获取到某一级,得到树...

  • java 树形结构

    树实体类 树结构排序工具类 测试类 输出结果

  • 我的第一个golang command脚本

    场景 维护数据库的树形结构的pid集合 具体代码

  • PHP树结构的构建和反构建

    数据库取出来的数据,怎么格式化为树形结构呢? 打印出结构如下 现在如果要把这样的树形结构回退到之前的二维数据 打印...

  • java集合快速构建成树形json

    1 场景 1.1 面对问题 java中,经常会需要构建树形结构的json,如构建一个省市区的树形结构。 此处情况,...

  • js 数组与树形结构对象相互转换

    数组 树形结构对象 数组转成树形结构 树形结构转成数组

  • 各种树形结构的对比

    二叉树 特点:左子树的节点值比父亲节点小,而右子树的节点值比父亲节点大。 如图: 平衡二叉树(avl树) http...

  • django 实现树形结构两种方式

    树形结构类似于数据结构中的二叉树,如果树形结构比较复杂的话,通过递归的方式查询并不是那么简介,多次 访问数据库查询...

  • Java打印树形结构

    序言 最近在学习算法相关的东西,有一些树形结构的数据需要打印出来开对不对,比如二分搜索树,于是我就写了一个工具类。...

  • java生成多层树结构

    我们经常会在网页,以及各种应用软件中见到多层树形结构。一般很多菜单,在数据库中存储时采用如下结构: id:当前项i...

网友评论

      本文标题:java 数据库树形结构的各种取值

      本文链接:https://www.haomeiwen.com/subject/spdnoktx.html