@UtilityClass
public class TreeUtil {
/**
* 两层循环实现建树
* @param treeNodes 传入的树节点列表
* @return <T extends TreeNode>
*/
public <T extends TreeNode> List<T> build(List<T> treeNodes, Object root) {
List<T> trees = new ArrayList<>();
for (T treeNode : treeNodes) {
if (root.equals(treeNode.getParentId())) {
trees.add(treeNode);
}
for (T it : treeNodes) {
if (it.getParentId().equals(treeNode.getId())) {
if (treeNode.getChildren() == null) {
treeNode.setChildren(new ArrayList<>());
}
treeNode.add(it);
}
}
}
return trees;
}
/**
* 使用递归方法建树
* @param treeNodes 树节点
* @return <T extends TreeNode>
*/
public <T extends TreeNode> List<T> buildByRecursive(List<T> treeNodes, Object root) {
List<T> trees = new ArrayList<>();
for (T treeNode : treeNodes) {
if (root.equals(treeNode.getParentId())) {
trees.add(findChildren(treeNode, treeNodes));
}
}
return trees;
}
/**
* 递归查找子节点
* @param treeNodes 树节点
* @return <T extends TreeNode>
*/
private <T extends TreeNode> T findChildren(T treeNode, List<T> treeNodes) {
for (T it : treeNodes) {
if (treeNode.getId().equals(it.getParentId())) {
if (treeNode.getChildren() == null) {
treeNode.setChildren(new ArrayList<>());
}
treeNode.add(findChildren(it, treeNodes));
}
}
return treeNode;
}
}
@Data
public class TreeNode {
protected String id;
protected String parentId;
protected List<TreeNode> children = new ArrayList<TreeNode>();
public void add(TreeNode node) {
children.add(node);
}
}
例子:
public List<SysTreeVo> getTreeById(String id) {
QueryWrapper<SysTreeNode> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("tree_id", id);
List<SysTreeNode> listTreeNode = this.selectList(queryWrapper);
//排序和赋值
List<SysTreeVo> listTree = listTreeNode.stream()
.sorted(Comparator.comparing(SysTreeNode::getSn))
.map(sysTreeNode -> {
SysTreeVo sysTreeVo = new SysTreeVo();
BeanUtils.copyProperties(sysTreeNode, sysTreeVo);
return sysTreeVo;
}).collect(Collectors.toList());
//构造树
List<SysTreeVo> trees = TreeUtil.build(listTree, "-1");
return trees;
}
@Data
public class SysTreeVo extends TreeNode {
/**
* 名称
*/
private String name;
}