java树结构Tree生成

该文介绍了如何使用Java构建树形结构,特别是动态路由的实现。通过buildTree()方法,将节点集合转换为映射表,遍历并依据父节点关系构建树,返回根节点集合。此方法利用泛型接口TreeNode实现了不同类型的节点抽象,适用于需要树结构的场景,降低了代码复用和错误的可能性。
摘要由CSDN通过智能技术生成

这篇文章介绍了如何利用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();
}

然后,PermMenuRuleVoPermAdminGroupVo可以实现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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

土拨鼠的博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值