如何处理树形结构问题

在这里插入图片描述

1.mysql自连接
适用于对于叶子节点平整的数据,只需要将表自连接,连接次数等于 层数-1
在这里插入图片描述
如果需要1 1-1 1-1-1就需要连接两次

SELECT
	one.id one_id,
	one.label one_label,
	two.id two_id,
	two.label two_label
FROM
	course_category AS one
	INNER JOIN course_category AS two ON one.id = two.parentid 
WHERE
	one.parentid = '1' 
	AND one.is_show = '1' 
	AND two.is_show = '1' 
ORDER BY
	one.orderby,
	two.orderby

在这里插入图片描述

2.递归(通用)
1.

 public CourseCategoryTreeDto buildTree(List<CourseCategory> categories, String parentId) {
        CourseCategoryTreeDto parentNode = new CourseCategoryTreeDto();
        List<CourseCategoryTreeDto> childrenNodes = new ArrayList<>();
        for (CourseCategory category : categories) {
            if (category.getParentid().equals(parentId)) {
                CourseCategoryTreeDto childNode = new CourseCategoryTreeDto();
                childNode.setId(category.getId());
                childNode.setName(category.getName());
                childNode.setLabel(category.getLabel());
                childNode.setIsShow(category.getIsShow());
                childNode.setOrderby(category.getOrderby());
                childNode.setIsLeaf(category.getIsLeaf());
                childNode.setParentid(parentId);
                // 如果该节点是父节点,则递归处理其子节点
                if (category.getIsLeaf() == 0) {
                    CourseCategoryTreeDto childTree = buildTree(categories, category.getId());
                    childNode.setChildrenTreeNodes(childTree.getChildrenTreeNodes());
                } else {
                    childNode.setChildrenTreeNodes(null);
                }
                childrenNodes.add(childNode);
            }
        }
            parentNode.setChildrenTreeNodes(childrenNodes);
        return parentNode;
    }



2.使用stream流

public CourseCategoryTreeDto buildTree(List<CourseCategory> categories, String parentId) {
    List<CourseCategoryTreeDto> childrenNodes = categories.stream()
            .filter(category -> category.getParentid().equals(parentId))
            .map(category -> {
                CourseCategoryTreeDto childNode = new CourseCategoryTreeDto();
                childNode.setId(category.getId());
                childNode.setName(category.getName());
                childNode.setLabel(category.getLabel());
                childNode.setIsShow(category.getIsShow());
                childNode.setOrderby(category.getOrderby());
                childNode.setIsLeaf(category.getIsLeaf());
                childNode.setParentid(parentId);
                // 如果该节点是父节点,则递归处理其子节点
                if (category.getIsLeaf() == 0) {
                    CourseCategoryTreeDto childTree = buildTree(categories, category.getId());
                    childNode.setChildrenTreeNodes(childTree.getChildrenTreeNodes());
                } else {
                    childNode.setChildrenTreeNodes(null);
                }
                return childNode;
            })
            .collect(Collectors.toList());
    CourseCategoryTreeDto parentNode = new CourseCategoryTreeDto();
    parentNode.setChildrenTreeNodes(childrenNodes);
    return parentNode;
}

调用方法

    public List<CourseCategoryTreeDto> getCourseCategoryTreeDto() {
        //找出所有可以显示的节点
        List<CourseCategory> courseCategories = courseCategoryMapper.selectList(new QueryWrapper<CourseCategory>().eq("is_show",1));
        CourseCategoryTreeDto courseCategoryTreeDto = buildTree(courseCategories, "1");
        //找到根节点

        return courseCategoryTreeDto.getChildrenTreeNodes();
    }

结果
在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值