Como lidar com problemas de estrutura em árvore

insira a descrição da imagem aqui

1. A auto-junção do mysql
é adequada para os dados planos dos nós folha, só precisa se auto-juntar à tabela, o número de conexões é igual ao número de camadas -1,
insira a descrição da imagem aqui
se você precisar de 1 1-1 1-1 -1, você precisa se conectar duas vezes

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

insira a descrição da imagem aqui

2. Recursão (Geral)
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 fluxos

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

método de chamada

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

        return courseCategoryTreeDto.getChildrenTreeNodes();
    }

resultado
insira a descrição da imagem aqui

Acho que você gosta

Origin blog.csdn.net/qq_56533553/article/details/129757715
Recomendado
Clasificación