有时候,需要返给前端需要的树状结构数据。
需要后端转换组装。
做了个通用工具类,非递归方式,简单易用。
上代码:
树结构类:
package com.ruoyi.shop;
import lombok.Data;
import java.util.List;
/**
* 返回前端树结构
* @Author wql
* @Date 2024/3/21 9:36
*/
@Data
public class TreeNode {
private Long id;
private String name;
private Long parentId;
private List<TreeNode> child;
private Boolean selectEnable;
}
转换工具类:
import com.ruoyi.shop.TreeNode;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @author : wuQingLiang
* @date : 2024/3/21
**/
public class TreeUtil {
public static List<TreeNode> buildNodeTree(List<TreeNode> treeNodeList){
List<TreeNode> treeTopNodeList=new ArrayList<>();//顶级节点列表
//创建map key为parentId 用来储存同一parentId下的兄弟节点
Map<Long,List<TreeNode>> parentNodeMap=new HashMap<>();
//list转map node的id作为key 用来根据id快速判断是否有此节点
Map<Long,TreeNode> nodeMap=treeNodeList.stream().collect(Collectors.toMap(node -> node.getId(), node -> node));
for(TreeNode treeNode:treeNodeList){
if(treeNode.getParentId()==null){ //没有parentId 为顶级节点
treeTopNodeList.add(treeNode);
}else {
if(nodeMap.get(treeNode.getParentId())==null){ //有parentId 但传入的list列表中不存在 也就是在list中同样是顶级节点
treeTopNodeList.add(treeNode);
}
if(parentNodeMap.get(treeNode.getParentId())==null){ //parentNodeMap中是否存在此节点父节点的key项
List<TreeNode> childNodeList=new ArrayList<>(); //不存在 则放入此父节点的key项
childNodeList.add(treeNode);
parentNodeMap.put(treeNode.getParentId(), childNodeList);
}else{ //存在 则兄弟节点list中加入此节点
List<TreeNode> childNodeList= parentNodeMap.get(treeNode.getParentId());
childNodeList.add(treeNode);
}
}
}
//顶级节点设置子节点
for(TreeNode treeNode:treeTopNodeList){
if(parentNodeMap.get(treeNode.getId())!=null){
treeNode.setChild(parentNodeMap.get(treeNode.getId()));
}
}
return treeTopNodeList;
}
}
标签:treeNode,递归,树状,List,list,util,import,parentNodeMap,节点
From: https://blog.csdn.net/wuqingliang510/article/details/136908697