封装的树形组件工具类

master
GPU is all you need 4 years ago
parent 5db28c7f1e
commit c09249dfe4
  1. 34
      awardBE/src/main/java/edu/ncst/award/common/util/treeUtils/TreeNode.java
  2. 70
      awardBE/src/main/java/edu/ncst/award/common/util/treeUtils/TreeUtils.java

@ -0,0 +1,34 @@
package edu.ncst.award.common.util.treeUtils;
import java.util.List;
public class TreeNode {
private Integer id;
private Integer parentId;
private List<TreeNode> Children;
public List<TreeNode> getChildren() {
return Children;
}
public void setChildren(List<TreeNode> children) {
Children = children;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getParentId() {
return parentId;
}
public void setParentId(Integer parentId) {
this.parentId = parentId;
}
}

@ -0,0 +1,70 @@
package edu.ncst.award.common.util.treeUtils;
import cn.hutool.core.util.ReflectUtil;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
* 菜单工具类
*
* @author Gpu is all you need
* @date 2022/05/07
*/
public class TreeUtils {
public interface Convert<T, TreeNode> {
void convert(T dataObject, TreeNode treeNode);
}
/**
* 构建树结构
*
* @param parentNodeId 根节点id
* @param treeNodes 所有节点的列表
* @param convert 转换接口实现 treeNode 转换 目标节点 (把目标节点的属性复制给treeNode)
* @param <T> 目标节点类型
* @return 树结构 目标节点类型
*/
static public <T, E extends TreeNode> List<E>
build(Integer parentNodeId, List<T> treeNodes, Class<E> dataObjectClass, Convert<T, E> convert) {
// 防止对原始数据做修改
List<E> result = new ArrayList<>();
for (T dataObject : treeNodes) {
E treeNode = ReflectUtil.newInstance(dataObjectClass);
convert.convert(dataObject, treeNode);
result.add(treeNode);
}
for (E menu : result) {
if (menu.getParentId().equals(parentNodeId)) {
innerBuild(menu, result);
}
}
// 只要树结构,去掉多余的那种散落其他地方但是已经挂在树上的
return result.stream().filter(treeNode -> treeNode.getParentId().equals(parentNodeId)).collect(Collectors.toList());
}
/**
* 递归内部构建
*
* @param parentTreeNode 初始父节点 / 上一次调用的节点作为父节点
* @param treeNodes 所有节点的列表
*/
static private void innerBuild(TreeNode parentTreeNode, List<? extends TreeNode> treeNodes) {
for (TreeNode treeNode : treeNodes) {
if (treeNode.getParentId().equals(parentTreeNode.getId())) {
if (parentTreeNode.getChildren() == null) {
parentTreeNode.setChildren(new ArrayList<>());
}
innerBuild(treeNode, treeNodes);
parentTreeNode.getChildren().add(treeNode);
}
}
}
}
Loading…
Cancel
Save