赞
踩
这篇文章介绍了如何利用Java编写树结构算法,特别是动态路由的实现。该篇文章的核心代码就是 buildTree()
方法,可以根据输入的节点集合(treeNodes
)构建树形结构,并返回根节点集合(result
)。
该方法的实现非常简单,其主要思想是将节点集合转换为节点映射表,然后遍历节点映射表,如果找到了父节点,则将该节点添加到父节点的子节点列表中。如果没有找到父节点,则说明该节点为根节点(或者是孤立的节点),将其添加到结果集中。这个实现过程中,利用了泛型接口 TreeNode
来为不同类型的节点提供统一的抽象接口,这很好地体现了Java语言的面向对象特性。
总的来说,这篇文章对Java树结构的解析进行了详尽的介绍,给读者提供了一个很好的参考。特别是对于那些需要使用树形结构的开发者来说,这篇文章提供了一个通用的实现方法,可以最大程度地减少代码的重复率和出错率。
/** * 构建树节点 * 先检查节点的pid是否为0,如果是,就将其添加到结果列表中。否则,查找节点的父节点,如果父节点不为空,就将当前节点添加为父节点的子节点。 */ public static <T extends TreeNode<T>> List<T> buildTree(List<T> treeNodes) { List<T> result = new ArrayList<>(); Map<Integer, T> nodeMap = new LinkedHashMap<>(treeNodes.size()); for (T treeNode : treeNodes) { nodeMap.put(treeNode.getId(), treeNode); } for (T node : nodeMap.values()) { if (node.getPid() == 0) { result.add(node); } else { T parent = nodeMap.get(node.getPid()); if (parent != null) { parent.getChildren().add(node); } } } return result; }
其中,TreeNode
是一个泛型接口,可以定义如下:
public interface TreeNode<T> {
Integer getId();
Integer getPid();
List<T> getChildren();
}
然后,PermMenuRuleVo
和PermAdminGroupVo
可以实现TreeNode
接口,如下:
public class PermMenuRuleVo implements TreeNode<PermMenuRuleVo> {
private Integer id;
private Integer pid;
private List<PermMenuRuleVo> children = new ArrayList<>();
// 省略getter和setter
}
public class PermAdminGroupVo implements TreeNode<PermAdminGroupVo> {
private Integer id;
private Integer pid;
private List<PermAdminGroupVo> children = new ArrayList<>();
// 省略getter和setter
}
使用这个方法时,只需要将菜单节点的集合或角色节点的集合作为参数传入即可,例如:
List<PermMenuRuleVo> menuNodes = getMenuNodes();
List<PermMenuRuleVo> menuTree = buildTree(menuNodes);
List<PermAdminGroupVo> adminGroupNodes = getAdminGroupNodes();
List<PermAdminGroupVo> adminGroupTree = buildTree(adminGroupNodes);
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。