TreeUtil
1.递归工具类:(构建递归树 且支持 通过 buildByRecursive方法 depth参数控制递归的层级深度 )
/**
* @Description: 树节点
* @Author: 徐刘
* @Date: 2020/12/5 12:18
*/
@Data
public class TreeNode {
protected String id;
protected String parentId;
private int level;
// 是否有子节点
private boolean isLeaf;
List<TreeNode> children = new ArrayList<>();
public void add(TreeNode node) {
children.add(node);
}
}
/**
* @Description: tree结构工具类
* @Author: 徐刘
* @Date: 2020/12/5 12:17
*/
public class TreeUtil {
/**
* 两层循环实现建树
*
* @param treeNodes 传入的树节点列表
* @return
*/
public static <T extends TreeNode> List<T> bulid(List<T> treeNodes, Object root) {
List<T> trees = new ArrayList<T>();
for (T treeNode : treeNodes) {
if (root.equals(treeNode.getParentId())) {
trees.add(treeNode);
}
for (T it : treeNodes) {
if (StringUtils.equalsIgnoreCase(it.getParentId(), treeNode.getId())) {
if (CollectionUtils.isEmpty(treeNode.getChildren())) {
treeNode.setChildren(new ArrayList<>());
}
treeNode.add(it);
}
}
}
return trees;
}
/**
* 使用递归方法建树
*
* @param treeNodes
* @param depth 需要递归的层级 深度
* @return
*/
public static <T extends TreeNode> List<T> buildByRecursive(List<T> treeNodes, Object root, Integer depth) {
List<T> trees = new ArrayList<T>();
int level = 1;
for (T treeNode : treeNodes) {
// 获取根节点(可以有多个根节点)
if (root.equals(treeNode.getParentId())) {
// 每个根节点递归添加子节点
trees.add(findChildren(treeNode, treeNodes,level,depth));
treeNode.setLevel(level);
}
}
return trees;
}
/**
* @Description: 递归查找子节点
* @Author: 徐刘
* @Date: 2020/12/7 9:57
* @param treeNode
* @param treeNodes
* @param level 层级
* @param depth
* @Return: T
*/
public static <T extends TreeNode> T findChildren(T treeNode, List<T> treeNodes, int level, Integer depth) {
if(depth==null){
depth = Integer.MAX_VALUE;
}
for (T it : treeNodes) {
if (StringUtils.equalsIgnoreCase(treeNode.getId(), it.getParentId())) {
if (treeNode.getChildren() == null) {
treeNode.setChildren(new ArrayList<>());
}
// 控制递归的 层级深度
if(level>=depth){
return treeNode;
}
treeNode.add(findChildren(it, treeNodes, level +1, depth));
}
treeNode.setLevel(level);
treeNode.setLeaf(treeNode.getChildren().size() <= 0);
}
return treeNode;
}
}
-
递归构建 非树形结构 ,返回指定节点 下子孙节点 收集成一个list 集合
商品分类 示例
/**
* @desc 递归查找出该节点下面的子孙节点
* @return
* @author xuliu
* @date 2020/7/4 15:32
*/
public List<CPProductClass> buildByRecursive(List<CPProductClass> targetProductClasslist, String classid) {
List<CPProductClass> trees = new ArrayList<>();
Integer level = 1;
findChildren(trees,targetProductClasslist,classid,level);
return trees;
}
private List<CPProductClass> findChildren(List<CPProductClass> trees, List<CPProductClass> targetProductClasslist, String classid,Integer level) {
if(targetProductClasslist !=null && targetProductClasslist.size()>0) {
for (CPProductClass cpProductClass : targetProductClasslist) {
if (cpProductClass.getParentclassid().equals(classid)) {
findChildren(trees,targetProductClasslist,cpProductClass.getClassid(),level+1);
cpProductClass.setClasslevel(level);
trees.add(cpProductClass);
}
}
}
return trees;
}