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-11578378 5-ブログ- 124102788.pc_relevant_multi_platform_whitelistv4& Depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-13-115783785-blog-124102788.pc_relevant_multi_platform_whitelistv4&utm_reレバントインデックス=14