Java树形结构的实现
TreeNode接口
public interface TreeNode<T> {
Long getId();
Long getParentId();
void setChildren(List<T> children);
}
工具类TreeUtil
public class TreeUtil {
public static <T extends TreeNode<?>> List<T> generateTrees(List<T> nodes) {
List<T> roots = new ArrayList<>();
for (Iterator<T> ite = nodes.iterator(); ite.hasNext(); ) {
T node = ite.next();
if (Objects.equals(node.getParentId(), 0L)) {
roots.add(node);
ite.remove();
}
}
roots.forEach(root -> {
setChildren(root, nodes);
});
return roots;
}
public static <T extends TreeNode> void setChildren(T parent, List<T> nodes) {
List<T> children = new ArrayList<>();
Object parentId = parent.getId();
for (Iterator<T> ite = nodes.iterator(); ite.hasNext(); ) {
T node = ite.next();
if (Objects.equals(node.getParentId(), parentId)) {
children.add(node);
ite.remove();
}
}
if (CollectionUtils.isEmpty(children)) {
return;
}
parent.setChildren(children);
children.forEach(child -> {
setChildren(child, nodes);
});
}
public static <T extends TreeNode<?>> List<T> getLeafList(T parent) {
List<T> leafList = new ArrayList<>();
fillLeaf(parent, leafList);
return leafList;
}
public static <T extends TreeNode> void fillLeaf(T parent, List<T> leafList) {
List<T> children = Lists.newArrayList();
if (CollectionUtils.isEmpty(children)) {
leafList.add(parent);
return;
}
for (T child : children) {
fillLeaf(child, leafList);
}
}
}
使用
@Data
public class RoleTreeVO implements TreeNode<RoleTreeVO> {
private Long parentId;
private Long id;
private String name;
private String enName;
private String description;
private List<RoleTreeVO> children;
}