Java构建树结构的公共方法是什么
这篇“Java构建树结构的公共方法是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java构建树结构的公共方法是什么”文章吧。
一、前提
pId需要传入用来确认第一级的父节点,而且pId可以为null。
树实体类必须实现:TreeNode接口
MyTreeVo必须有这三个属性:id、pId、children
可以根据不同需求,配置TreeNode和MyTreeVo中固定的属性
二、代码
定义TreeNode接口
public interface TreeNode { String getId(); String getpId(); List getChildren(); }
需要将pId作为参数传入,在方法中添加一个pId参数,用于确认第一级的父节点。
这个示例代码中,buildTree方法接收两个参数,一个是泛型类型的参数List,另一个是pId,用于确认第一级的父节点。在找到所有的根节点后,我们需要对每个根节点调用buildChildren方法,递归构建子节点。
以便支持传入的pId作为顶级节点
public class TreeBuilder { /** * @param nodes 需要构建的nodes,不要继承 TreeNode,且需要有 TreeNode 下的三个方法 * @param pId 父id。为null则是所有pid为null的是顶级节点;不为null,则是从给的pId往下查询并构建树 **/ public static <T extends TreeNode> List<T> buildTree(List<T> nodes, String pId) { List<T> roots = new ArrayList<>(); for (T node : nodes) { if (node.getId().equals(pId) || (node.getParentId() == null && (pId == null || pId.equals(node.getId())))) { roots.add(node); } } for (T root : roots) { buildChildren(root, nodes); } return roots; } private static <T extends TreeNode> void buildChildren(T node, List<T> nodes) { for (T child : nodes) { if (child.getParentId() != null && child.getParentId().equals(node.getId())) { node.getChildren().add(child); buildChildren(child, nodes); } } } }
构建到几级
如果再增加一个参数,构建到树的第几层该如何实现?
根据需求,如果增加一个参数来控制构建到树的第几层,可以在buildChildren方法中添加一个level参数,用于记录当前节点的层数。在递归构建子节点时,如果当前节点的层数小于指定的层数,则继续递归构建子节点,否则停止递归。以下是修改后的Java示例代码:
public class TreeBuilder { /** * @param level 级别 从1开始。1是最顶层 **/ public static <T extends TreeNode> List<T> buildTree(List<T> nodes, String pId, int level) { List<T> roots = new ArrayList<>(); for (T node : nodes) { if (node.getId().equals(pId) || (node.getParentId() == null && (pId == null || pId.equals(node.getId())))) { roots.add(node); } } for (T root : roots) { buildChildren(root, nodes, level, 1); } return roots; } private static <T extends TreeNode> void buildChildren(T node, List<T> nodes, int level, int currentLevel) { if (currentLevel >= level) { return; } for (T child : nodes) { if (child.getParentId() != null && child.getParentId().equals(node.getId())) { if (node.getChildren() == null) { node.setChildren(new ArrayList<>()); } node.getChildren().add(child); buildChildren(child, nodes, level, currentLevel + 1); } } } }
三、使用
1、实现TreeNode接口
public class MyTreeVo implements TreeNode { /** * 主键 */ private String id; /** * 父节点ID */ private String pId; /** * 子级 */ private List<MyTreeVo> children = Lists.newArrayList(); //其他属性…… public List<MyTreeVo> getChildren() { return children; } public String getId() { return id; } public String getpId() { return pId; } //其他属性的getter、setter……
2、使用
pId可以传入null,也可以传入需要从哪个节点(X)开始构造的 X的id
List<MyTreeVo> tree = TreeUtilQz.buildTree(vos,null); //tree就是构建好的树结构数据
3、样例
{ "data": [ { "id": "e6ee51485389495cb923a122be800011", "pId": "", "name": "一、钢管钢管", "children": [ { "id": "e6ee51485389495cb923a122be800014", "pId": "e6ee51485389495cb923a122be800011", "name": "(二)嘎嘎嘎嘎嘎", "children": [] }, { "id": "e6ee51485389495cb923a122be800013", "pId": "e6ee51485389495cb923a122be800011", "name": "(一)顶顶顶顶", "children": [] } ] }, { "id": "e6ee51485389495cb923a122be800012", "pId": "", "name": "二、噢噢噢噢", "children": [ { "id": "e6ee51485389495cb923a122be800015", "pId": "e6ee51485389495cb923a122be800012", "name": "二的下级", "children": [ { "id": "e6ee51485389495cb923a122be800016", "pId": "e6ee51485389495cb923a122be800015", "name": "二的下级的下级", "children": [] } ] } ] } ] }
以上就是关于“Java构建树结构的公共方法是什么”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注蜗牛博客行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:niceseo99@gmail.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
评论