首页 > 编程语言 >Java构建树结构的公共方法

Java构建树结构的公共方法

时间:2023-04-12 16:46:44浏览次数:36  
标签:node Java 树结构 List pId 构建 nodes null id

一、前提

  • 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
-- pId比如可以传入3、样例中的 “二、噢噢噢噢”的id=“e6ee51485389495cb923a122be800012”。然后构建出来的,就是“二、噢噢噢噢”的下级树

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": []
                        }
                    ]
                }
            ]
        }
    ]
}

标签:node,Java,树结构,List,pId,构建,nodes,null,id
From: https://www.cnblogs.com/kakarotto-chen/p/17310304.html

相关文章

  • PAT-basic-1029 旧键盘 java c++
    一、题目旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及实际被输入的文字,请你列出肯定坏掉的那些键。输入格式:输入在2行中分别给出应该输入的文字、以及实际被输入的文字。每段文字是不超过80个字符的串,由字母A-Z(包括......
  • 基于vue和vite的cesium、cesiumNavigation使用--(1)项目构建及引入
    ​系统信息windows10LTSC21H2vscode:1.77.1nodejs:18.15.0npm:9.5.0版本信息vue:3.2.47vite:4.1.4cesium:1.104.0vue-router:4.1.6默认在以上的js相关版本下构建环境,并包括创建vue项目,创建vue-router文件并构建路由,创建vue视图等等,以上内容不再赘述。如环境和版本不同,则项......
  • java发送Http请求
    使用java11添加的HttpClient新API发送Http(Https)请求HTTP客户端是在Java11中添加的。它可以用于通过网络请求HTTP资源。它支持HTTP/1.1和HTTP/2(同步和异步编程模型),将请求和响应主体作为反应流处理,并遵循熟悉的构建器模式。参考文章:https://blog.csdn.net/allway2/articl......
  • AI对关于用vue构建低代码平台的认识
    写一个完整的低代码平台需要考虑到很多方面,包括需求分析、架构设计、UI/UX设计、后端开发以及前端实现等。下面是一个实现Vue低代码平台的大致步骤:1.需求分析:明确低代码平台的核心功能和用户需求,例如表单设计器、流程设计器、报表设计器、数据可视化等。2.架构设计:根据需求分......
  • Java开发笔记(不定时更新)
    1.IDEA在引入外部库时编译出现找不着库的问题:在resources目录中,新建一个lib目录,将外部库拷贝进去,这样打包时就不会出现找不见的情况。 2.对象列表按属性排序时空指针错误处理问题:List.sort(Comparator.comparing(X::a)在对列表按属性排序时,如果属性为空会报nullpoint的空指......
  • Java语言在Spark3.2.4集群中使用Spark MLlib库完成朴素贝叶斯分类器
    一、贝叶斯定理贝叶斯定理是关于随机事件A和B的条件概率,生活中,我们可能很容易知道P(A|B),但是我需要求解P(B|A),学习了贝叶斯定理,就可以解决这类问题,计算公式如下:  P(A)是A的先验概率P(B)是B的先验概率P(A|B)是A的后验概率(已经知道B发生过了)P(B|A)是B的后验概率(已经知道A发生过了)二......
  • IDEA Java项目中Maven Lifecycle功能
    功能点clean用于清除之前构建生成的所有文件,具体为清除Target目录中的所有文件,包括该目录删除了install生成的所有文件。validate用于验证项目是否正确,并且说必要的信息是否都可用。compile编译项目的源代码,主要是Java文件。test编译和运行测试代码。p......
  • BS结构的系统通信原理(没有涉及到java小程序)
    B/S结构的系统通信原理(没有涉及到java小程序)WEB系统的访问过程第一步:打开浏览器第二步:找到地址栏第三步:输入一个合法的网址第四步:回车第五步:在浏览器上会展示相应的结果关于域名:http://www.baidu.com/(网址)www.baidu.com是一个域名在浏览器地址上输入域名,回车之后......
  • Java到底是值传递还是引用传递?
    1.什么是形参和实参形参:就是形式参数,用于定义方法的时候使用的参数,是用来接收调用者传递的参数的。实参:就是实际参数,用于调用时传递给方法的参数。实参在传递给别的方法之前是要被预先赋值的。/***@author一灯*@apiNoteJava传递示例**/publicclassDemo{......
  • java 逗号拼接字符串
    逗号拼接字符串可以使用String类的静态方法join()来实现这个功能,示例代码如下:```javapublicclassPhoneNumbers{publicstaticvoidmain(String[]args){StringphoneNumber1="18801083588";StringphoneNumber2="15709106355";Stri......