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

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


image.png

需求:

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


/**
     * @Description: 筛选层级不足四级的视频分类(从下到上)
     * @Param:  mapAll:所有数据的map,orderMap:结果map
     * @return:
     */
    public Map> recursionFindUp(
                                        Map treeVoMap,
                                        Map> orderMap){
        if (orderMap.keySet().stream().findFirst().get()==0 ){//找到了最上级
            return orderMap;
        }else {
            Map> 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 getOptionsList( Integer maxLev) {
        //@Select("select id , parent_id AS 'parentId' , name , level , del from rv_video_category where del=0 and level <= #{maxLev}")
        List treeVos = treeMapper.selectTreeOptionByMaxLev(maxLev);
        Map 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 collect = treeVoMap.values().stream().filter(e -> e.getParentId() == 0).collect(Collectors.toList());
        //以上跟实现一步骤一样,搜索条件增加了一个level <= #{maxLev}。只是没单独抽离出来
        List 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 allVOS,
                  List 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 数据库树形结构的各种取值)