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