parent
5db28c7f1e
commit
c09249dfe4
@ -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…
Reference in new issue