集合根据上下级关系转树结构

news2024/9/23 22:12:14

1、创建实体对象

public class TreeNode {
    private String id;
    private String pid;
    private String name;

    private List<TreeNode> children;


    public TreeNode(String id,String pid,String name){
        this.id = id;
        this.pid = pid;
        this.name = name;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getPid() {
        return pid;
    }

    public void setPid(String pid) {
        this.pid = pid;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }



    public List<TreeNode> getChildren() {
        return children;
    }

    public void setChildren(List<TreeNode> children) {
        this.children = children;
    }

}

2、创建集合转换树工具类

public class TreeVo {
    private List<TreeNode> listJXKHTreeNode=new ArrayList<TreeNode>();
    private List<TreeNode> lstRootJXKHTreeNode=new ArrayList<TreeNode>();
    private int iMaxLevel=1;

    public List<TreeNode> getListJXKHTreeNode() {
        return listJXKHTreeNode;
    }

    public void setListJXKHTreeNode(List<TreeNode> listJXKHTreeNode) {
        this.listJXKHTreeNode = listJXKHTreeNode;
    }

    public List<TreeNode> getLstRootJXKHTreeNode() {
        return lstRootJXKHTreeNode;
    }

    public void setLstRootJXKHTreeNode(List<TreeNode> lstRootJXKHTreeNode) {
        this.lstRootJXKHTreeNode = lstRootJXKHTreeNode;
    }

    public int getiMaxLevel() {
        return iMaxLevel;
    }

    public void setiMaxLevel(int iMaxLevel) {
        this.iMaxLevel = iMaxLevel;
    }



    public static List<TreeNode> listGetStree(List<TreeNode> list) {
        List<TreeNode> treeList = new ArrayList<TreeNode>();
        for (TreeNode tree : list) {
            //找到根
            if (tree.getPid() == null) {
                treeList.add(tree);
            }
            //找到子
            for (TreeNode treeNode : list) {
                if(treeNode.getPid()!=null){
                    if (treeNode.getPid().equals(tree.getId())) {
                        if (tree.getChildren() == null) {
                            tree.setChildren(new ArrayList<TreeNode>());
                        }
                        tree.getChildren().add(treeNode);
                    }
                }

            }
        }
        return treeList;
    }

    //将list转换为树
    public  List<TreeNode> MakeTreeByList(List<TreeNode> listData ){
        if(listData != null) {
            for(int i=0;i<listData.size();i++){

                TreeNode mapObject = listData.get(i);
                String strAPID = mapObject.getPid() == null ? "" : mapObject.getPid();
                Boolean IsHaveParent=false;
                //找根节点
                for(int j=0;j<listData.size();j++){
                    TreeNode mapObjectB=listData.get(j);
                    String strBID=mapObjectB.getId();
                    if(strAPID.equals(strBID)){
                        IsHaveParent=true;
                        break;
                    }
                }
                //如果没有父级节点则为根节点
                if(!IsHaveParent){
                    lstRootJXKHTreeNode.add(mapObject);
                }

            }
        }

        //找上下级关系
        for(int i=0;i<listData.size();i++){

            for(int j=0;j<listData.size();j++){

                if(listData.get(i).getId().equals(listData.get(j).getPid())){
                    if(listData.get(i).getChildren()==null){
                        listData.get(i).setChildren(new ArrayList<TreeNode>());
                    }
                    listData.get(i).getChildren().add(listData.get(j));

                }

            }

        }

        return lstRootJXKHTreeNode;

    }
}

3、测试实例

public class TestListToTree {
    public static void main(String[] args) {
        List<TreeNode> treeNodeList = new ArrayList<>();
        treeNodeList.add(new TreeNode("1","0","人力资源部"));
        treeNodeList.add(new TreeNode("12","1","人一"));
        treeNodeList.add(new TreeNode("12","1","人二"));
        treeNodeList.add(new TreeNode("14","1","人三"));
        treeNodeList.add(new TreeNode("11","1","人四"));
        treeNodeList.add(new TreeNode("2","0","财务资源部"));
        treeNodeList.add(new TreeNode("21","2","财一"));
        treeNodeList.add(new TreeNode("22","2","财二"));
        treeNodeList.add(new TreeNode("23","2","财三"));
        TreeVo treeVo = new TreeVo();
        List<TreeNode> treeNodes = treeVo.MakeTreeByList(treeNodeList);
        for (TreeNode treeNode : treeNodes) {
            System.out.println(treeNode.getName());
        }
    }
}

运行结果:
在这里插入图片描述

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

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

相关文章

独立游戏《Project:Survival》UE5C++开发日志0——游戏介绍

该游戏是《星尘异变》团队的下一款作品&#xff0c;太空科幻题材的生存游戏&#xff0c;我将负责使用C、蓝图实现游戏的基础框架和核心功能&#xff0c;其中还包含使用人工智能算法助力游戏开发或帮助玩家运营 目前已有功能&#xff1a; 1.3D库存系统&#xff1a;所有库存中的物…

Python练习宝典:Day 3 - 选择题 - 字符串与正则表达式、基础练习补充

目录 一、基础练习补充二、字符串与正则表达式 一、基础练习补充 1.下列能返回变量s的数据类型的是: A.print(type(s)) B.print(s) C.print(int(s)) D.print(str(s))2.如果想要换行,可以使用: A.\ B.\n C.\t D.\f3.合法的标识符是: A.M-N B.and C.Dior_Ysl D.6_friends4.在…

计算机毕业设计springboot+vue项目分享在线服务平台

目录 功能和技术介绍系统实现截图开发核心技术介绍&#xff1a;使用说明开发步骤编译运行需求分析系统设计软件测试核心代码部分展示详细视频演示源码获取 功能和技术介绍 本项目包含程序源码和MySql脚本和文档,idea开发,支持Eclipse。使用vue的本质是SpringFramework【IoC&am…

【门牌制作 / A】

题目 代码 #include <bits/stdc.h> using namespace std; int main() {int cnt 0;for (int i 1; i < 2020; i){string s;s to_string(i);cnt count(s.begin(), s.end(), 2);}cout << cnt; }

用c++实现分数(fraction)类

这个想法已经有3周&#xff0c;于是今天将它实现了。 Step 1基础&#xff1a; 我们需要定义一个class——fraction&#xff0c;全部属性定义为public class fraction{ public:}; 现在&#xff0c;让我们添加2个元素&#xff0c;分子和分母——fz和fw Step 1.1添加分子分母…

QT| “无法粘贴窗口部件”错误以及customplot

“无法粘贴窗口部件”错误以及customplot “无法粘贴窗口部件”错误customplot下载添加到项目中使用QCustomPlot常用的代码 “无法粘贴窗口部件”错误 情景&#xff1a;使用QT设计界面&#xff0c;很多部分比较类似&#xff0c;可以复制另一个界面的ui&#xff0c;但是粘粘的时…

c++278函数指针

#define _CRT_SECURE_NO_WARNINGS #include<stdlib.h> #include<string.h> #include<stdio.h>//数组类型基本语法知识梳理 //定义一个数组类型 //int a[10];//定义一个指针数组类型//定义一个指向数组类型的指针 数组类型的指针void main() {int a[10];//a代…

“AI+Security”系列第3期(二):AI赋能自动化渗透测试

近日&#xff0c;“AI Security” 系列第 3 期&#xff1a;AI 安全智能体&#xff0c;重塑安全团队工作范式技术沙龙活动正式举行。该活动由安全极客、Wisemodel 社区、InForSec 网络安全研究国际学术论坛和海升集团联合主办&#xff0c;吸引了线上与线下千余名观众参与。 在…

数据结构基础详解:拓扑排序和关键路径_AOE网的详细画法

文章目录 1.有向无环图&#xff08;前置知识&#xff09;2. 拓扑排序2.1 AOV网2.2 排序序列 3.关键路径3.1 AOE网3.2 关键活动3.2.1 事件v~k~的最早发生时间v~e~(k)3.2.2 活动a~I~的最迟开始时间l(i)3.2.3 事件v~k~的最迟发生时间v~l~(k)3.2.4 活动a~I~的最早开始时间e(i)3.2.5…

插件MyBatis X

文章目录 插件插件MyBatis X 插件 插件MyBatis X 安装完重启idea 蓝色 sql映射文件 红色 mapper接口 点击对应的鸟&#xff0c;sql映射文件和对应mapper接口就能相互跳转

Python应用指南:利用高德地图API获取POI数据

随着地理信息系统&#xff08;GIS&#xff09;技术的发展&#xff0c;地理位置数据在城市规划、商业分析、旅游推荐等多个领域发挥着越来越重要的作用。POI&#xff08;Point of Interest&#xff0c;兴趣点&#xff09;数据作为地理信息的重要组成部分&#xff0c;提供了丰富的…

线程对象的生命周期、线程等待和分离

线程对象的生命周期、线程等待和分离 #include <iostream> #include<thread> using namespace std;bool is_exit false;//用于判断主线程是否退出 void ThreadMain() {cout << "begin sub thread main ID: " << this_thread::get_id() &l…

数据结构(Day19)

一、学习内容 单链表 头删 int front_dele(Plink L) {if(LNULL||L->len0){printf("头删失败\n");return -1;}Plink Q L->next;//保留要删除的1号节点L->next L->next->next;L->len--;free(Q);//释放空间QNULL;return 0; }尾删 int rear_dele(Pli…

JavaWeb - 5 - 前端工程化 Element

一.前后端分离开发 前后端混合开发 缺点&#xff1a;沟通成本高&#xff0c;分工不明确&#xff0c;不便管理&#xff0c;不便维护拓展 前后端分离开发 当前最为主流的开发模式&#xff1a;前后端分离 前后端分离开发中很重要的是API接口文档&#xff08;如&#xff1a;YApi&…

AH2212-12V转4.2V充电芯片

AH2212——12V转4.2V充电芯片&#xff0c;峰值2A输出编程电流&#xff0c;实现精准同步开关降压锂电池充电 随着科技的不断发展&#xff0c;移动电源、智能穿戴、电动工具等设备的应用越来越广泛&#xff0c;对电池充电芯片的需求也日益增大。本文将为您介绍一款高性能的充电芯…

通过iFIX在ARMxy边缘计算网关上实现维护管理

在当今快速发展的工业环境中&#xff0c;维护管理的有效性直接影响到生产效率和设备可靠性。随着物联网和边缘计算的兴起&#xff0c;传统的维护方式正在被更智能和高效的解决方案所替代。ARMxy系列的BL340控制器&#xff0c;凭借其灵活的IO配置和强大的处理能力&#xff0c;成…

linux使用docker安装运行kibana报错“Kibana server is not ready yet“的解决办法

首先docker log <container-id>查看日志是什么问题(以下是我的最后一条日志报错): {"type":"log","timestamp":"2024-09-23T12:27:0700:00","tags":["error","elasticsearch-service"],"pi…

【中关村在线-注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

基于单片机的无线宠物自动喂食系统设计

本设计研究了一种无线宠物自动喂食器&#xff0c;其功能是先将宠物饲料放入其中&#xff0c;通过设定喂食时间点&#xff0c;当到达这一时间点后&#xff0c;系统开始播报语音同时控制步进电机转动&#xff0c;自动进行喂食。本设计主要研究怎么设定时间并进行投喂&#xff0c;…

(学习记录)使用 STM32CubeMX——GPIO引脚输出配置

学习总结&#xff1a;&#xff08;学习总结&#xff09;STM32CubeMX HAL库 学习笔记撰写心得https://blog.csdn.net/Wang2869902214/article/details/142435481 STM32F103C8T6的GPIO引脚输出配置 时钟配置 &#xff08;学习记录&#xff09;使用 STM32CubeMX——配置时钟&…