package com.xaaef.molly.common.util;
import com.xaaef.molly.common.domain.TreeNode;
import lombok.extern.slf4j.Slf4j;
import java.util.*;
import java.util.stream.Collectors;
/**
*
* 将 List 数据递归成,树节点的形式
*
*
* @author Wang Chen Chen
* @version 1.0
* @date 2021/7/5 9:31
*/
@Slf4j
public class TreeNodeUtils {
private final static Long ROOT = 0L;
/**
* 查找所有根节点
*
* @param allNodes 节点
* @return Set
*/
public static > List findRoots(List allNodes) {
return allNodes.stream()
.filter(node -> node.getParentId().equals(ROOT))
.map(node -> findChildren(node, allNodes))
.sorted(TreeNodeUtils::comparator)
.collect(Collectors.toList());
}
/**
* 递归查找子节点
*
* @param treeNode
* @param treeNodes
* @return TreeNode
*/
private static > T findChildren(T treeNode, List treeNodes) {
for (T it : treeNodes) {
if (treeNode.getId().equals(it.getParentId())) {
if (treeNode.getChildren() == null) {
treeNode.setChildren(new ArrayList());
}
treeNode.getChildren().add(findChildren(it, treeNodes));
}
}
// 排序
var children = treeNode.getChildren();
if (children != null && children.size() > 1) {
var collect = children.stream()
.sorted(TreeNodeUtils::comparator)
.distinct()
.collect(Collectors.toList());
treeNode.setChildren(collect);
}
return treeNode;
}
/**
* 排序
*
* @return TreeNode
*/
private static > int comparator(TreeNode o1, TreeNode o2) {
long temp = o1.getSort() - o2.getSort();
if (temp > 0)
return 1;
else if (temp < 0)
return -1;
else
return 0;
}
}