TreeUtils 树工具类

news2024/9/21 14:46:38

数据展示:

如图:部门树数据  ,树形的基础数据 id  、 parentId 、label 便可形成

嵌套对象字段如下:{id: 103, parentId: 101, label: "研发部门", weight: 1}

一、工具类 

继承了 hutoo 的工具类 TreeUtil 引入hutool 依赖

@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class TreeBuildUtils extends TreeUtil {

    /**
     * 根据前端定制差异化字段
     */
    public static final TreeNodeConfig DEFAULT_CONFIG = TreeNodeConfig.DEFAULT_CONFIG.setNameKey("label");

    /**
     * <简述>
     * <详细描述>
     * @author syf
     * @date 2024/8/15 11:27
     * @param list 提供的集合
     * @param nodeParser 节点解析器
     * @return java.util.List<cn.hutool.core.lang.tree.Tree < K>>
     */
    public static <T, K> List<Tree<K>> build(List<T> list, NodeParser<T, K> nodeParser) {
        if (CollUtil.isEmpty(list)) {
            return null;
        }
        // 获取父节点
        K k = ReflectUtils.invokeGetter(list.get(0), "parentId");
        return TreeUtil.build(list, k, DEFAULT_CONFIG, nodeParser);
    }

}

 TreeNodeConfig 树形需要的字段:可以通过set字段修改

public class TreeNodeConfig implements Serializable {
    private static final long serialVersionUID = 1L;
    public static TreeNodeConfig DEFAULT_CONFIG = new TreeNodeConfig();
    private String idKey = "id";
    private String parentIdKey = "parentId";
    private String weightKey = "weight";
    private String nameKey = "name";
    private String childrenKey = "children";
    private Integer deep;

。。。。。省里get  set

 TreeUtil  方法展示:树形构建已经操作节点方法

二、准备简单树形数据

@Slf4j
public class TestTreeNode {
   static List<TreeNode<Integer>> createTreeNodes(){
       List<TreeNode<Integer>> list = new ArrayList<>();
       TreeNode<Integer>  root= new TreeNode<>();
       root.setName("总公司");
       root.setId(1);
       root.setParentId(0);

       TreeNode<Integer>  node1= new TreeNode<>();
       node1.setName("分子公司1");node1.setId(2);node1.setParentId(1);


       TreeNode<Integer>  node2= new TreeNode<>();
       node2.setName("财务部");node2.setId(3);node2.setParentId(2);
       TreeNode<Integer>  node3= new TreeNode<>();
       node3.setName("开发部").setId(4).setParentId(2);

       list.add(root);
       list.add(node1);
       list.add(node2);
       list.add(node3);
       return list;
   }

    public static void main(String[] args) {
        buildSingle();
    }

    static void  buildSingle(){
        List<TreeNode<Integer>> list = createTreeNodes();
        Tree<Integer> integerTree = TreeBuildUtils.buildSingle(list);
        Console.log(integerTree);
    }


}

 打印结果:

null[0]
  总公司[1]
    分子公司1[2]
      财务部[3]
      开发部[4]

三、测试所有常用树形方法,并附上DEMO演示

  1. 构建树形
  2. 获取指定节点
  3. 添加节点
  4. 移除节点
  5. 遍历
  6. 过滤
  7. 克隆
public static void main(String[] args) {
        buildSingle();
    }

    static void  buildSingle(){
        List<TreeNode<Integer>> list = createTreeNodes();

        //build 对比上面 去掉最外层 null 的父节点
        List<Tree<Integer>> build = TreeBuildUtils.build(list);
        Console.log(build);


        Console.log("-------------------------------------------测试开始------------------------------------------------");

        //原生 构建树结构
        Tree<Integer> integerTree = TreeBuildUtils.buildSingle(list);
        Console.log(integerTree);

        // 获取父节点
        Tree<Integer> parent = integerTree.getParent();
        Console.log("getParent->{}", parent);
        // 获取节点
        Tree<Integer> node = integerTree.getNode(2);
        Console.log("getNode->{}", node);
        // 获取父节点名称
        List<CharSequence> parentsName = integerTree.getParentsName(4, true);
        Console.log("getParentsName->{}", parentsName);
        // 获取配置
        TreeNodeConfig config = integerTree.getConfig();


        // 添加子节点
//        Tree<Integer> integerTree1 = integerTree.addChildren(node);
//        Console.log("addChildren->{}", integerTree1);
        // 判断是否有子节点
        boolean b = integerTree.hasChild();
        Console.log("hasChild->{}", b);
        // 获取子节点
        List<Tree<Integer>> children = integerTree.getChildren();
        Console.log("getChildren->{}", children);

        //遍历整数树结构,并打印每个节点
        integerTree.walk(new Consumer<Tree<Integer>>() {
            @Override
            public void accept(Tree<Integer> integerTree) {
                // 打印节点
                Console.log("walk->{}", integerTree);
            }
        });


        //根据是否包含特定名称(如“分子公司”)来筛选树结构数据
        Tree<Integer> filterNew = integerTree.filterNew(new Filter<Tree<Integer>>() {
            @Override
            public boolean accept(Tree<Integer> integerTree) {
                if (null != integerTree.getName() && integerTree.getName().toString().contains("分子公司")) {
                    return true;
                }
                return false;
            }
        });
        Console.log("filterNew->{}", filterNew);


        // 创建一个过滤器,用于筛选出名称中包含"分子公司"的Tree对象
        Tree<Integer> filter = filterNew.filter(new Filter<Tree<Integer>>() {
            @Override
            public boolean accept(Tree<Integer> integerTree) {
                if (null != integerTree.getName() && integerTree.getName().toString().contains("分子公司")) {
                    return true;
                }
                return false;
            }
        });
        Console.log("filter->{}", filter);


        // 克隆一个整数树结构
        Tree<Integer> integerTree2 = integerTree.cloneTree();
        Console.log("cloneTree->{}", integerTree2);


    }

测试结果:

null[0]
  总公司[1]
    分子公司1[2]
      财务部[3]
      开发部[4]

[总公司[1]
  分子公司1[2]
    财务部[3]
    开发部[4]
]
getParent->null
getNode->分子公司1[2]
  财务部[3]
  开发部[4]

getParentsName->[开发部, 分子公司1, 总公司]
hasChild->true
getChildren->[总公司[1]
  分子公司1[2]
    财务部[3]
    开发部[4]
]
walk->null[0]
  总公司[1]
    分子公司1[2]
      财务部[3]
      开发部[4]

walk->总公司[1]
  分子公司1[2]
    财务部[3]
    开发部[4]

walk->分子公司1[2]
  财务部[3]
  开发部[4]

walk->财务部[3]

walk->开发部[4]

filterNew->null[0]
  总公司[1]
    分子公司1[2]
      财务部[3]
      开发部[4]

filter->null[0]
  总公司[1]
    分子公司1[2]
      财务部[3]
      开发部[4]

cloneTree->null[0]
  总公司[1]
    分子公司1[2]
      财务部[3]
      开发部[4]


Process finished with exit code 0

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

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

相关文章

springboot+Quartz通过数据库控制定时任务执行与时间

前言 在我们的springboot项目中&#xff0c;有很多种实现定时任务的方式 有用最简单的 Scheduled 实现定时任务,即&#xff1a; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component;Component EnableScheduling p…

Arthas相关命令

官方网站&#xff1a;命令列表 | arthas 也可以用idea的插件arthas-idea的插件根据你想定位的代码生成命令 jvm 相关 dashboard - 当前系统的实时数据面板getstatic - 查看类的静态属性heapdump - dump java heap, 类似 jmap 命令的 heap dump 功能jvm - 查看当前 JVM 的信息l…

Studying-刷题补充| 数组:58.区间和、44. 开发商购买土地

目录 58.区间和 44. 开发商购买土地 总结 58.区间和 文档讲解&#xff1a;代码随想录58.区间和 题目&#xff1a;58. 区间和&#xff08;第九期模拟笔试&#xff09; (kamacoder.com) 学习&#xff1a;本题最直接的做法是&#xff0c;将数组Array保存好后&#xff0c;通过…

linux - mathematica 安装教程

注意事项&#xff1a; 文件目录不能有空格&#xff0c;不能有中文 安装包 Mathematica - 12.1 安装 解压软件包 7z x Mathematica_12.1.1_LINUX_CN.zip运行安装器 命令运行后解压出Mathematica_12.1.1_LINUX_CN.sh, 运行该安装脚本 chmod x Mathematica_12.1.1_LINUX_CN…

STM32后备区域:读写BKP备份寄存器与使用RTC实时时钟详解

目录 STM32后备区域&#xff1a;读写BKP备份寄存器与使用RTC实时时钟详解 1 什么是STM32的后备区域 分割线* 2.1 BKP备份寄存器简介 2.2 BKP备份寄存器基本结构 2.3 BKP外设头文件 bkp.h介绍 2.4 读写 BKP备份寄存器 操作步骤 2.5 编写 读写备份寄存器 5.1 文件介绍 …

Centos7 系统下安装go语言开发环境

该文章简述在Centos7 amd64 系统中安装go开发环境的方法。 一、golang官网查看对应平台最新的golang版本 Golang 官网地址&#xff1a;All releases - The Go Programming Language 二、 安装GO的过程及相关命令 # 1、下载go&#xff0c;这里使用 go1.22.5 版本&#xff0c;可…

【ACL2024】基于长尾检索知识增强的大语言模型

近日&#xff0c;阿里云人工智能平台PAI与阿里集团安全部内容安全算法团队、华东师范大学何晓丰教授团队合作&#xff0c;在自然语言处理顶级会议ACL2024上发表论文《On the Role of Long-tail Knowledge in Retrieval Augmented Large Language Models》&#xff0c;论文主题为…

爆火游戏《黑神话:悟空》研发背后有哪些故事?

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门面向中国程序员和企业提供企业级一体化 DevOps 平台&#xff0c;用来帮助用户实现需求管理、源代码托管、CI/CD、安全合规&#xff0c;而且所有的操作都是在一个平台上进行&#xff0c;省事省心省钱。可以一键安装极狐GitL…

美团的测试面试题,真的很难吗?

年前&#xff0c;我的一个粉丝留言给我说&#xff0c;他在面试美团的自动化测试岗的时候&#xff0c;不幸挂掉了。 越想越可惜&#xff0c;回想面试经过&#xff0c;好好总结了几个点&#xff0c;发现面试没过的主要原因是在几个关键的问题没有给到面试官想要的答案 美团的面…

寻访中国100家.NET中大企业 —— 第二站:苏州行

一&#xff1a;事情起因 在.NET圈里混了十多年&#xff0c;相信有不少人知道我专注于玩 .NET高级调试&#xff0c;如今技术上的硬实力还是能够解决市面上的一些疑难杂症&#xff0c;但软实力却在另一个极端&#xff0c;如&#xff08;人际交往&#xff0c;人情事故&#xff09…

[RCTF2015]EasySQL1

打开题目 点进去看看 注册个admin账户&#xff0c;登陆进去 一个个点开看&#xff0c;没发现flag 我们也可以由此得出结论&#xff0c;页面存在二次注入的漏洞&#xff0c;并可以大胆猜测修改密码的源代码 resoponse为invalid string的关键字是被过滤的关键字&#xff0c;Le…

氟化工特氟龙精馏装置:PFA氟化氢反应装置的应用

精馏装置是进行精馏的一种塔式气液接触装置。利用混合物中各组分具有不同的挥发度&#xff0c;即在同一温度下各组分的蒸气压不同这一性质&#xff0c;使液相中的轻组分&#xff08;低沸物&#xff09;转移到气相中。 实验精馏装置的组成 实验精馏装置通常由以下几部分组成&am…

Linux2.6设备驱动开发

一&#xff1a;Linux2.6驱动设备开发的特点 1&#xff1a;首先是属于字符型设备注册的方法之一 这种开发接口是在Linux2.6引入的&#xff0c;之前的版本不支持这种开发方式&#xff0c;也是目前最标准的开发方式。 2&#xff1a;Linux2.6的设备开发 不再去限制设备号&#xf…

(javaweb)SpringBootWeb案例(毕业设计)案例--部门管理

目录 1.准备工作 2.部门管理--查询功能 3.前后端联调 3.部门管理--新增功能 1.准备工作 mapper数据访问层相当于dao层 根据页面原型和需求分析出接口文档--前后端必须遵循这种规范 大部分情况下 接口文档由后端人员来编写 前后端进行交互基于restful风格接口 http的请求方式…

TypeScript学习笔记(二)——TypeScript 高级类型

目录 1. class 类 1.1 class 关键字的基本使用 1.2 类继承 1.3 类成员可见性 1.4 类成员只读修饰符 2. 类型兼容性 2.1 类型兼容性 2.2 接口兼容性 2.3 函数兼容性 3. 交叉类型 4. 泛型 4.1 创建泛型函数 4.2 泛型约束 4.3 多个泛型的类型变量约束 4.4 泛型接口…

【深度学习入门项目】基于支持向量机的手写数字识别

目录 导入必要的包1. 数据集2. 数据处理3. 训练过程4. 输出结果完整代码 本项目使用SVM训练模型&#xff0c;用于预测手写数字图片。 导入必要的包 numpy: 这个库是Python中常用的数学计算库。在这个项目中&#xff0c;我使用numpy来处理图像数据&#xff0c;将图像数据转换为…

FPGA开发——DS18B20读取温度并且在数码管上显示

一、简介 在上一篇文章中我们对于DS18B20的相关理论进行了详细的解释&#xff0c;同时也对怎样使用DS18B20进行了一个简单的叙述。在这篇文章我们通过工程来实现DS18B20的温度读取并且实现在数码管伤显示。 1、基本实现思路 根据不同时刻的操作&#xff0c;我们可以使用一个状…

基于vue框架的班级网站的设计与实现vg66m(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;班级,学生,班级活动,班级相册,班级开支,活动记录 开题报告内容 基于Vue框架的班级网站设计与实现 开题报告 一、引言 随着互联网技术的飞速发展&#xff0c;网络已经成为人们日常生活中不可或缺的一部分。在教育领域&#xff0c;班级…

大白话解析:深入浅出大模型RAG模块全解析

文章目录 什么是 RAG&#xff1f; 技术交流&资料通俗易懂讲解大模型系列 RAG模块化 什么是模块化RAG&#xff1f; 索引模块 块优化 滑动窗口从小到大元数据附加 结构化组织 层次化索引知识图谱文档组织 预检索模块 查询扩展 多查询子查询CoVe 查询转换 重写HyDE 查询路由…

TON链上游戏项目开发基本要求及模式创建与海外宣发策略

TON&#xff08;The Open Network&#xff09;是由Telegram开发的区块链平台&#xff0c;以其高速、低延迟、和高扩展性吸引了大量开发者和项目方。TON链上游戏项目作为一个新兴领域&#xff0c;结合了区块链技术和游戏产业&#xff0c;为用户提供了全新的游戏体验和经济激励。…