数据库中存的数据结构:id和parent_id
需求:
- 得到一个树形结构的json数据
- 自定义获取到某一级,得到树形结构的json数据(有些只创建到了第二级,但想获得到第四级的树,需要将不到第四级的排除掉)
- 将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);
}
}
}
}
结果: