JAVA-중첩된 하위 노드가 있는 트리 구조를 반복적으로 구축하고 매개변수를 프런트 엔드로 반환&& 특정 노드 아래의 모든 리프 노드 가져오기&& 특정 노드(하위 노드가 없는 노드) 아래의 리프 노드 가져오기


JAVA 프로젝트에서는 parentId를 기반으로 트리 구조가 반복적으로 구성되고 해당 하위 노드가 중첩되어 프런트 엔드로 반환됩니다. 특정 루트 노드 아래의 모든 리프 노드를 가져오고, 특정 루트 노드 아래의 리프 노드(자식 노드가 없는 노드)를 가져오고, 리프 노드 ID만 가져옵니다.

트리 구축

tagId는 노드 ID이고, parentId는 상위 노드 ID이고, tagName은 노드 이름이고, children은 하위 노드 목록 유형입니다.

getRootNode()는 모든 루트 노드를 획득하는 것으로, 부모 노드 ID(parentId)를 0으로 결정하여 루트 노드로 한다.

buildChildTree()는 모든 노드의 집합을 얻어 현재 노드의 부모 노드 ID(parentId)가 루트 노드의 ID(tagId)와 동일한지, 즉 현재 노드가 자식 노드인지를 판단합니다. 그런 다음 현재 노드의 상황을 재귀적으로 확인하고 자체 메서드를 호출합니다.

buildTree()는 각 루트 노드를 기반으로 트리 구조를 구축합니다.

    /**
     *   获取需构建的所有根节点(顶级节点) "0"
     *   @return 所有根节点List集合
     */
    public List<TagRequestVO> getRootNode(){
    
    chre
        // 保存所有根节点(所有根节点的数据)
        List<TagRequestVO> rootNodeList = new ArrayList<>();
        // treeNode:查询出的每一条数据(节点)
        List<Tag> nodeList = tagMapper.selectList(null);
        for (Tag treeNode : nodeList){
    
    
            // 判断当前节点是否为根节点,
            if (treeNode.getParentId().equals("0")) {
    
    
                // 是,添加
                //tagId为节点id;parentId为其父节点id;tagName为节点名称
                TagRequestVO response = new TagRequestVO();
                response.setTagId(treeNode.getTagId());
                response.setTagName(treeNode.getTagName());
                response.setParentId(treeNode.getParentId());
                rootNodeList.add(response);
            }
        }
        return rootNodeList;
    }

    /**
     *  递归-----构建子树形结构
     *  @param  pNode 根节点(顶级节点)
     *  @return 整棵树
     */
    public TagRequestVO buildChildTree(TagRequestVO pNode){
    
    
        List<TagRequestVO> childTree = new ArrayList<>();
        // nodeList:所有节点集合(所有数据)
        List<Tag> nodeList = tagMapper.selectList(null);
        for (Tag treeNode : nodeList) {
    
    
            // 判断当前节点的父节点ID是否等于根节点的ID,即当前节点为其下的子节点
            //tagId为节点id;parentId为其父节点id;tagName为节点名称
            if (treeNode.getParentId().equals(pNode.getTagId())) {
    
    
                // 再递归进行判断当前节点的情况,调用自身方法
                TagRequestVO response = new TagRequestVO();
                response.setTagId(treeNode.getTagId());
                response.setTagName(treeNode.getTagName());
                response.setParentId(treeNode.getParentId());
                childTree.add(buildChildTree(response));
            }
        }
        // for循环结束,即节点下没有任何节点,树形构建结束,设置树结果
        pNode.setChildren(childTree);
        return pNode;
    }

	/**
     *  根据每一个顶级节点(根节点)进行构建树形结构
     *  @return  构建整棵树
     */
    public List<TagRequestVO> buildTree(){
    
    
        // treeNodes:保存一个顶级节点所构建出来的完整树形
        List<TagRequestVO> treeNodes = new ArrayList<>();
        // getRootNode():获取所有的根节点
        for (TagRequestVO treeRootNode : getRootNode()) {
    
    
            // 将顶级节点进行构建子树
            treeRootNode = buildChildTree(treeRootNode);
            // 完成一个顶级节点所构建的树形,增加进来
            treeNodes.add(treeRootNode);
        }
        return treeNodes;
    }

자식 노드가 없을 때 자식은 빈 배열 []을 반환하며, 비어 있어도 후회하지 않으려면 VO에 설명을 추가하면 반환되지 않습니다.

//为空不返回
@JsonInclude(JsonInclude.Include.NON_EMPTY)
//为null不返回
@JsonInclude(JsonInclude.Include.NON_NULL)

노드 아래의 모든 리프 노드 가져오기

지정된 필터링에 필요한 노드 ID(tagId)를 루트 노드 가져오기 함수(getRootNodeByTag())에 추가해야 한다는 점을 제외하면 트리 구성은 위와 크게 다르지 않습니다. 하위 트리 구조(buildChildTreeByTag())는 실제로 위와 동일하며, 트리를 구축한 후 그 아래의 리프 노드를 일치시킵니다.

getAllChildren()은 모든 리프 노드를 가져옵니다.

getTreeTagId()는 모든 리프 노드 ID(tagId)를 가져옵니다.

	/**
     *   获取需构建的根节点,根据根节点tagId匹配
     *   @return 所有根节点List集合
     */
    public List<TagRequestVO> getRootNodeByTag(String tagId){
    
    
        QueryWrapper<Tag> wrapper = new QueryWrapper<>();
        wrapper.and(w -> w.eq("tag_id", tagId).or().eq("parent_id", tagId));
        List<Tag> nodeList = tagMapper.selectList(wrapper);
        List<TagRequestVO> rootNodeList = new ArrayList<>();
        for (Tag treeNode : nodeList){
    
    
            TagRequestVO response = new TagRequestVO();
            if (treeNode.getParentId().equals("0")) {
    
    
                response.setTagId(treeNode.getTagId());
                rootNodeList.add(response);
            }
        }
        return rootNodeList;
    }

	/**
     *  递归-----构建子树形结构
     *  @param  pNode 根节点(顶级节点)
     *  @return 整棵树
     */
    public TagRequestVO buildChildTreeByTag(TagRequestVO pNode){
    
    
        List<TagRequestVO> childTree = new ArrayList<>();
        List<Tag> nodeList = tagMapper.selectList(null);
        for (Tag treeNode : nodeList) {
    
    
            if (treeNode.getParentId().equals(pNode.getTagId())) {
    
    
                TagRequestVO response = new TagRequestVO();
                response.setTagId(treeNode.getTagId());
                response.setParentId(treeNode.getParentId());
                childTree.add(buildChildTreeByTag(response));
            }
        }
        pNode.setChildren(childTree);
        return pNode;
    }

	/**
     *  根据每一个顶级节点(根节点)进行构建树形结构
     *  @return  构建整棵树
     */
    public List<TagRequestVO> buildTreeByTag(String tagId){
    
    
        List<TagRequestVO> treeNodes = new ArrayList<>();
        for (TagRequestVO treeRootNode : getRootNodeByTag(tagId)) {
    
    
            treeRootNode = buildChildTreeByTag(treeRootNode);
            treeNodes.add(treeRootNode);
        }
        return treeNodes;
    }

	//获取该节点下的所有叶子节点
    private List<TagRequestVO> getAllChildren(TagRequestVO tagRequestVO,List returnList){
    
    
    	//获取叶子节点children
        List<TagRequestVO> childrenList = tagRequestVO.getChildren();
        if(childrenList!=null && childrenList.size()>0){
    
    
            for(TagRequestVO children : childrenList){
    
    
            	//递归
                getAllChildren(children,returnList);
                returnList.add(children);
            }
        }
        return returnList;
    }

	//获取该节点下的所有叶子节点tagId
	public List<String> getTreeTagId(String tagId){
    
    
        List returnList = new ArrayList();
        List<TagRequestVO> tag = getAllChildren(buildTreeByTag(tagId).get(0), returnList);
        List<String> tagIdList = new ArrayList<>();
        for(TagRequestVO tagChildren : tag){
    
    
            tagIdList.add(tagChildren.getTagId());
        }
        return tagIdList;
    }

특정 노드 아래에 자식 노드가 없는 리프 노드를 가져옵니다(자식 없음).

지정된 필터링에 필요한 노드 ID(tagId)를 루트 노드 가져오기 함수(getRootNodeByTag())에 추가해야 한다는 점을 제외하면 트리 구성은 위와 크게 다르지 않습니다. 하위 트리 구조(buildChildTreeByTag())는 실제로 위와 동일하며, 트리를 구축한 후 그 아래의 리프 노드를 일치시킵니다.

getChildren()은 리프 노드를 모두 획득하는데, 판단 조건에는 자식(리프 노드)이 없다는 점에 유의하세요.

getTreeChildrenTagId는 모든 리프 노드 ID(tagId)를 가져옵니다.

	/**
     *   获取需构建的根节点,根据根节点tagId匹配
     *   @return 所有根节点List集合
     */
    public List<TagRequestVO> getRootNodeByTag(String tagId){
    
    
        QueryWrapper<Tag> wrapper = new QueryWrapper<>();
        wrapper.and(w -> w.eq("tag_id", tagId).or().eq("parent_id", tagId));
        List<Tag> nodeList = tagMapper.selectList(wrapper);
        List<TagRequestVO> rootNodeList = new ArrayList<>();
        for (Tag treeNode : nodeList){
    
    
            TagRequestVO response = new TagRequestVO();
            if (treeNode.getParentId().equals("0")) {
    
    
                response.setTagId(treeNode.getTagId());
                rootNodeList.add(response);
            }
        }
        return rootNodeList;
    }

	/**
     *  根据每一个顶级节点(根节点)进行构建树形结构
     *  @return  构建整棵树
     */
    public List<TagRequestVO> buildTreeByTag(String tagId){
    
    
        List<TagRequestVO> treeNodes = new ArrayList<>();
        for (TagRequestVO treeRootNode : getRootNodeByTag(tagId)) {
    
    
            treeRootNode = buildChildTreeByTag(treeRootNode);
            treeNodes.add(treeRootNode);
        }
        return treeNodes;
    }


	/**
     *  递归-----构建子树形结构
     *  @param  pNode 根节点(顶级节点)
     *  @return 整棵树
     */
    public TagRequestVO buildChildTreeByTag(TagRequestVO pNode){
    
    
        List<TagRequestVO> childTree = new ArrayList<>();
        List<Tag> nodeList = tagMapper.selectList(null);
        for (Tag treeNode : nodeList) {
    
    
            if (treeNode.getParentId().equals(pNode.getTagId())) {
    
    
                TagRequestVO response = new TagRequestVO();
                response.setTagId(treeNode.getTagId());
                response.setParentId(treeNode.getParentId());
                childTree.add(buildChildTreeByTag(response));
            }
        }
        pNode.setChildren(childTree);
        return pNode;
    }

	//获取该节点下 没有子节点的(没有children) 叶子节点
    private List<TagRequestVO> getChildren(TagRequestVO tagRequestVO,List returnList){
    
    
        List<TagRequestVO> childrenList = tagRequestVO.getChildren();
		// 退出递归的条件 只有一层维度结构
        if(childrenList==null || childrenList.size()<=0){
    
    
            returnList.add(tagRequestVO);
        }else{
    
    
			// 有多层维度结果
            for(TagRequestVO children : childrenList){
    
    
                getChildren(children,returnList);
            }
        }
        return returnList;
    }
    
	//获取该节点下 没有子节点的(没有children) 叶子节点的tagId
    public List<String> getTreeChildrenTagId(String tagId){
    
    
        List returnList = new ArrayList();
        List<TagRequestVO> tag = getChildren(buildTreeByTag(tagId).get(0), returnList);
        List<String> childrenTagIdList = new ArrayList<>();
        for(TagRequestVO tagChildren : tag){
    
    
            childrenTagIdList.add(tagChildren.getTagId());
        }
        return childrenTagIdList;
    }

참고: https://blog.csdn.net/a18505947362/article/details/122458089

https://blog.csdn.net/weixin_36368404/article/details/115783785?spm=1001.2101.3001.6650.13&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-13-115783785 -블로그- 124102788.pc_relevant_multi_platform_whitelistv4&length_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-13-115783785-blog-124102788.pc_relevant_multi_platform_whitelistv4&utm_relevant_ 인덱스=14

추천

출처blog.csdn.net/weixin_44436677/article/details/127589077