How to deal with tree structure problems

insert image description here

1. mysql self-join
is suitable for flat data of leaf nodes, only need to self-join the table, the number of connections is equal to the number of layers -1,
insert image description here
if you need 1 1-1 1-1-1, you need to connect twice

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

insert image description here

2. Recursion (General)
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. Use streams

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;
}

call method

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

        return courseCategoryTreeDto.getChildrenTreeNodes();
    }

result
insert image description here

Guess you like

Origin blog.csdn.net/qq_56533553/article/details/129757715