/** * Copyright (c) 2018 人人开源 All rights reserved. * * https://www.renren.io * * 版权所有,侵权必究! */ package io.renren.common.utils; import io.renren.common.validator.AssertUtils; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; /** * 树形结构工具类,如:菜单、部门等 * * @author Mark sunlightcs@gmail.com * @since 1.0.0 */ 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; } }