美文网首页
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 数据库树形结构的各种取值

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