• 搜索
    搜新闻
  • 您的位置: 首页 >  资讯

    详解Java构建树结构的公共方法

    脚本之家来源:2023-07-07 16:15:52


    【资料图】

    目录
    一、前提二、代码三、使用1、实现TreeNode接口2、使用3、样例

    一、前提

    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  List buildTree(List nodes, String pId) {
            List 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  void buildChildren(T node, List 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  List buildTree(List nodes, String pId, int level) {
            List 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  void buildChildren(T node, List 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 children = Lists.newArrayList();
     
        //其他属性……
     
        public List getChildren() {
            return children;
        }
     
        public String getId() {
            return id;
        }
     
        public String getpId() {
            return pId;
        }
     
        //其他属性的getter、setter……

    2、使用

    pId可以传入null,也可以传入需要从哪个节点(X)开始构造的 X的id
    List 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构建树结构的公共方法的文章就介绍到这了,更多相关Java构建树结构内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    关键词:

    下一篇: 最后一页
    上一篇: 携手百万粉丝坏画梦想家,海信电视在上海K11生动诠释动画艺术世界