树生成工具泛型接口 TreeNode

news2025/5/26 7:49:03

1、定义泛型接口

// 实现接口需要传入两个参数,第一个T 为节点中的id,第二个R 为节点,TreeNode。
public interface TreeNode<T, R extends TreeNode<T, R>> {
    /**
     * 获取节点id
     *
     * @return 树节点id
     */
    T id();

    /**
     * 获取该节点的父节点id
     *
     * @return 父节点id
     */
    T parentId();

    /**
     * 是否是根节点
     *
     * @return true:根节点
     */
    boolean isRoot();

    /**
     * 设置节点的子节点列表
     *
     * @param children 子节点
     */
    void setChildren(List<R> children);

    /**
     * 获取所有子节点
     *
     * @return 子节点列表
     */
    List<R> getChildren();

    /**
     * 是否叶子节点
     *
     * @return 是否叶子节点
     */
    default boolean isLeaf() {
        return getChildren().size() == 0;
    }

    /**
     * 列表生成树结构
     *
     * @param nodes 要生成树状结构的集合
     * @param <T>   键类型
     * @param <R>   结点类型
     * @return 树结构
     */
    static <T, R extends TreeNode<T, R>> List<R> generateTree(List<R> nodes) {
        List<R> result = new ArrayList<>();
        // 从性能考虑。(nodes.size() / .75f) + 1 是HashMap总的空间大小
        Map<T, R> id2Node = new LinkedHashMap<>(Math.max((int) (nodes.size() / .75f) + 1, 16));
        nodes.forEach(e -> {
            id2Node.put(e.id(), e);
            e.setChildren(new ArrayList<>());
        });
        id2Node.forEach((id, node) -> {
            if (!node.isRoot()) { // 若非根节点
                R parent = id2Node.get(node.parentId()); // 拿到父节点
                if (parent != null) {
                    List<R> children = parent.getChildren(); // 拿到父节点的所有子节点
                    if (children == null) { // 子节点为null就初始化
                        children = new ArrayList<>();
                        parent.setChildren(children);
                    }
                    children.add(node); // 将当前节点加到父亲的子节点集合
                }
            } else { // 根节点
                result.add(node);
            }
        });
        return result; // 返回根节点
    }
}

2、实现泛型接口

我这里需求是按照树的形式返回所有行政区。比如 省 --> 市 --> 区
因此定义行政区树结构:

@Data
@ApiModel(value = "行政区树结构VO")
// 这里必须实现 TreeNode<T, R> 其中R类型必须继承或实现了 TreeNode
public class DistrictTreeVO implements TreeNode<String, DistrictTreeVO> {

    @ApiModelProperty("行政区编码")
    private String districtCode;

    @ApiModelProperty("行政区名称")
    private String districtName;

    @ApiModelProperty("父行政区编码")
    private String parentDistrictCode;

    @ApiModelProperty("子级行政区")
    private List<DistrictTreeVO> children;

	// 实现泛型接口中未实现的方法。获取id,获取pid,判断是否是根节点
	// 泛型接口中已经实现的方法可以直接调用
    @Override
    public String id() {
        return this.getDistrictCode();
    }

    @Override
    public String parentId() {
        return this.getParentDistrictCode();
    }

    @Override
    public boolean isRoot() {
        return StringUtils.equals(this.getParentDistrictCode(), TradeXzq.MAX_PARENT_DISTRICT_CODE);
    }
}

3、查询测试

在这里插入图片描述

在调用 TreeNode.generateTree 方法时
DistrictTreeVO 就是 R,String 就是 T。根据 类 DistrictTreeVO 中实现的为准。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/334956.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

读书笔记//《数据分析:企业的贤内助》

数据分析师是个杂家——作者陈哲。 为什么写这本书&#xff1f; 懂得再多知识却不会用&#xff0c;原因是缺少通往思路、方法和技能的两条路径——项目流程和项目应用&#xff08;案例&#xff09; —————————— 数据分析师的晋升空间 &#xff08;见第2章&#xff0…

NLP模型检查英语语法错误

当NLP模型产生了语法错误&#xff0c;怎么办&#xff1f;比如&#xff0c;He wants that you send him an email.没关系&#xff0c;现在可以像小时候的英语老师&#xff0c;改作文一样简单。只要装上一个专门纠正语法错误的库就可以&#xff0c;还是毫秒钟就可揪出来的那种。这…

【shell】awk、sed、sort是什么?怎么用?

目录 一、AWK 干什么用的&#xff1f; 使用起来有什么条件&#xff1f; 怎么使用&#xff1f; 二、sed 功能&#xff1f; sed怎样读取数据&#xff1f; 怎样调用sed &#xff1f; 三、sort 功能是什么&#xff1f; 命令有哪些&#xff1f; 本文只讲解了一些简略的知…

“千年之恋”注册页面制作

“千年之恋”注册页面制作一、实验名称&#xff1a;二、实验日期&#xff1a;三、实验目的&#xff1a;四、实验内容&#xff1a;五、实验步骤&#xff1a;六、实验结果&#xff1a;七、源程序&#xff1a;八、心得体会&#xff1a;一、实验名称&#xff1a; “千年之恋”注册…

算法导论—SAT、NP、NPC、NP-Hard问题

算法导论—SAT、NP、NP-Hard、NPC问题SAT 问题基本定义问题复杂性P、NP、NP-Hard、NP-Complete&#xff08;NPC&#xff09;证明NP-Hard关系图NP问题的概念约化的定义NPC问题NP-Hard问题SAT 问题基本定义 SAT 问题 (Boolean satisfiability problem, 布尔可满足性问题,SAT): 给…

C++之完美转发、移动语义(forward、move函数)

完美转发1. 在函数模板中&#xff0c;可以将自己的参数“完美”地转发给其它函数。所谓完美&#xff0c;即不仅能准确地转发参数的值&#xff0c;还能保证被转发参数的左、右值属性不变。2. C11标准引入了右值引用和移动语义&#xff0c;所以&#xff0c;能否实现完美转发&…

「敏捷架构」敏捷架构:规模化敏捷开发的策略

与流行的看法相反&#xff0c;架构是敏捷软件开发工作的一个重要方面&#xff0c;就像传统的工作一样&#xff0c;并且是扩展敏捷方法以满足现代组织的现实需求的关键部分。但是&#xff0c;敏捷专家的架构方式与传统主义者的方式略有不同。本文讨论以下问题&#xff1a; 迈向敏…

Acer传奇Go电脑开机自动安装软件卡死怎么重装系统?

Acer传奇Go电脑开机自动安装软件卡死怎么重装系统&#xff1f;一些用户在网络上下载安装了一些恶意软件之后&#xff0c;导致电脑中了病毒。每次开机联网之后&#xff0c;有很多的软件就会自动开始下载&#xff0c;占满你的桌面&#xff0c;这个情况导致电脑直接卡死了&#xf…

前端知识点复盘

组件和jsx <body><div id"root"></div><script type"text/babel">const root ReactDOM.createRoot(document.getElementById("root"))class App extends React.Component {render() {return (<div> <h1>s…

MOTORTECH控制器维修燃气机点火模块MIC500

MOTORTECH发电机点火控制器模块维修注意事项: (1)由于主配电板经常发生振动,因此故障多发生在振动较强烈之处,所以要检查引起振动的原因并排除之,如躲开共振转速,增加防震垫片等。 (2)尘埃是造成接触不良的原因,对接线端子座及防尘罩等容易附着灰尘的场所要经常清扫。 1、看元…

2023级浙江大学MBA提面优秀资格最新经验分享

通过将近一年时间的奋斗&#xff0c;我的浙大MBA备考之路也算是告一段落了&#xff0c;在备考之初&#xff0c;我也在网络上看了很多“经验帖”&#xff0c;深知提前批面试对于浙大MBA录取来说这个有多重要&#xff0c;虽然我的笔试成绩还没有出来&#xff0c;但是在考完后估分…

HTTP请求返回304状态码以及研究nginx中的304

文章目录1. 引出问题2. 分析问题3. 解决问题4. 研究nginx中的3044.1 启动服务4.2 ETag说明4.3 响应头Cache-Control1. 引出问题 之前在调试接口时&#xff0c;代码总出现304问题&#xff0c;如下所示&#xff1a; 2. 分析问题 HTTP 304: Not Modified是什么意思&#xff1f; …

2022年新一代kaldi团队技术输出盘点

目录 1. 技术创新 1.1 Pruned RNN-T loss 1.2 RNN-T 的快速 GPU 解码 1.3 多码本量化索引的知识蒸馏 1.4 RNN-T 和 CTC 的低延时训练 1.5 Zipformer 1.6 Small tricks 2. 模型部署 2.1 Sherpa 2.1 Sherpa-ncnn 3. 更多的 recipe 和模型 参考资料 1. 技术创新 1.1 …

C语言程序环境剖析——探究从.c到.exe之路

程序环境1.程序的翻译环境和执行环境2. 详解编译 链接2.1 翻译环境2.2 编译的三部分预编译编译汇编2.3链接3.运行环境1.程序的翻译环境和执行环境 在ANSI C的任何一种实现中&#xff0c;都存在两个不同的环境。 翻译环境&#xff0c;在这个环境中源代码被转换成可执行的机器指…

three.js 基础认识与简单应用

一、前言 1. 什么是three.js&#xff1f;你将它理解成threejs&#xff0c;three表示3D的意思&#xff0c;js表示JavaScript的意思&#xff0c;合起来&#xff0c;three.js就是使用JavaScript来写3D程序的意思。three.js是基于WebGL的一个运行在浏览器上的开源框架&#xff0c;使…

企业级安全软件装机量可能大增

声明 本文是学习大中型政企机构网络安全建设发展趋势研究报告. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 研究背景 大中型政企机构是网络安全保护的重中之重&#xff0c;也是国内网络安全建设投入最大&#xff0c;应用新技术、新产品最多的机构…

云原生系列之使用 prometheus监控MySQL实战

文章目录前言一. 实验环境二. 安装MySQL5.72.1 配置yum源2.2 安装MySQL之前的环境检查2.3 开始使用yum安装2.4 启动MySQL并测试三. 安装MySQL_exporter3.1 MySQL_exporter的介绍3.2 mysql_exporter的安装3.3 设置MySQL账户&#xff0c;用于数据收集3.4 启动mysql_exporter3.5 配…

2023年信息系统项目管理师,需要哪些备考资料?

其实考前心态是相当重要的&#xff0c;你需要战胜的一直是你自己。你首先要明确自己考试必胜的决心&#xff0c;树立好的备考心态&#xff0c;学习只要用对了方法&#xff0c;考试通过的几率还是挺高的。备考心得&#xff1a;我自己备考了3个月的时间通过了&#xff0c;分享一套…

Linux多线程---生产者消费者模型和线程池

目录 生产者消费者模型 条件变量 接口 实现基于阻塞队列的cp模型 POSIX信号量 信号量的PV操作 接口&#xff1a; 初始化信号量&#xff1a; 销毁信号量 等待信号量 发布信号量 基于环形队列的生产者消费者模型 线程池 应用场景&#xff1a; 如何实现&#xff1f; …

DHCP中继及配置

为什么需要DHCP Relay&#xff1f;产生背景解决方案DHCP Relay工作原理DHCP Relay配置实现产生背景 随着网络规模的扩大&#xff0c;网络中就会出现用户处于不同网段的情况。 这个时候客户A和客户B要请求IP地址时&#xff0c;首先会发送DHCP Discover广播包&#xff0c;这个广…