package xiaozhi.common.utils; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import xiaozhi.common.validator.AssertUtils; /** * 树形结构工具类,如:菜单、部门等 * Copyright (c) 人人开源 All rights reserved. * Website: https://www.renren.io */ public class TreeUtils { /** * 根据pid,构建树节点 */ public static > List build(List treeNodes, Long pid) { // pid不能为空 AssertUtils.isNull(pid, "pid"); List treeList = new ArrayList<>(); for (T treeNode : treeNodes) { if (pid.equals(treeNode.getPid())) { treeList.add(findChildren(treeNodes, treeNode)); } } return treeList; } /** * 查找子节点 */ private static > T findChildren(List treeNodes, T rootNode) { for (T treeNode : treeNodes) { if (rootNode.getId().equals(treeNode.getPid())) { rootNode.getChildren().add(findChildren(treeNodes, treeNode)); } } return rootNode; } /** * 构建树节点 */ public static > List build(List treeNodes) { List result = new ArrayList<>(); // list转map Map nodeMap = new LinkedHashMap<>(treeNodes.size()); for (T treeNode : treeNodes) { nodeMap.put(treeNode.getId(), treeNode); } for (T node : nodeMap.values()) { T parent = nodeMap.get(node.getPid()); if (parent != null && !(node.getId().equals(parent.getId()))) { parent.getChildren().add(node); continue; } result.add(node); } return result; } }