树形结构的快速生成

news2024/11/24 7:30:23

背景

相信大家都遇到过树形结构,像是文件列表、多级菜单、评论区的设计等等,我们都发现它有很多层级,第一级可以有多个,下边的每一个层级也可以有多个;有的可以设计成无限层级的,有的只能设计成两级。那么作为程序员,我觉得应该具备这种思维:程序的拓展性。就像shigen接手需求一样,上次接到了评论回复的需求,产品觉得两级回复和多级回复可以分成两期做,细心的我就发现这完全可以整成一个需求做呢。于是我一次性把之后的都做了。

我们先分析一下具体的场景:

我们常常会遇到多级文件,类似我们电脑的文件管理系统。我们可以把每个文件夹和文件抽象一下,在linux系统中,文件就包括文本文件和文件夹。OK,万物皆文件shigen就在这里狂一下。那它们要根据什么关联起来呢,数据库怎么存储呢?

文件系统多级文件

分析

目前,我们主要的解决方案是这样的。

    item_list = [
        Item(111, "one", None, None),
        Item(111-1, "one", None, None),
        Item(222, "two", 111, None),
        Item(333, "three", 111, None),
        Item(444, "four", 333, None),
        Item(444-1, "four", 333, None),
        Item(444-2, "four", 444-1, None),
    ]

我们只需要存储单条数据就可以,那它们的关联就需要构造函数的第三个参数pid,保存自己上一个节点的id,如果上一个节点的id(pid)是空的,OK,那它就是第一级别的。注意,第一级别的可能有多个。Item的构造方法是这样的:

class Item():

    def __init__(self, id: int, name: str, pid: Optional[int], children: Optional[List]):
        self.id = id
        self.name = name
        self.pid = pid
        self.__children = children

那么,分析起来发现就是几句话,代码怎么实现呢?shigen在这里列举了两种语言的实现方式:javapython。来一起看看吧!

代码实现

Java

在来到Java这一步,我不会使用传统的递归的方式,我使用的是java8,所以我更喜欢用stream+lambda表达式,写起来异常的简洁,别人不夸优雅都不行!

Item类的定义和python代码案例的是一样的,java的定义是这样的:

    @Data
    @AllArgsConstructor
    static class Item {

        private Integer id;
        private String name;
        private Integer pid;
        private List<Item> children;

    }

那怎么实现这个tree结构呢?shigen用的一个函数,仅仅三行代码,是三行!

    private static List<Item> getTree(ArrayList<Item> items) {
        // 获得非顶级节点的数据并按照pid分组
        Map<Integer, List<Item>> nodeMap = items.stream().filter(item -> item.getPid() != null).collect(Collectors.groupingBy(Item::getPid));

        // 循环设置子节点
        items.forEach(item -> item.setChildren(nodeMap.get(item.id)));

        // 获得根节点的数据
        List<Item> treeNode = items.stream().filter(node -> node.getPid() == null).collect(Collectors.toList());
        return treeNode;
    }

这是一个通用的方法,我把我的代码截图也贴上来。

Java tree的代码实现

这边shigen也在思考把这个方法做成通用的,这样就可以作为一个工具类使用了。也欢迎伙伴们来交流一下。

python

shigen对这个案例提供了双语言的支持。但是不得不说在和javastream对比之下,python的代码还是显得比较繁琐了。但是也是一种解决思路和参考。

def build_tree_structure(items:List[Item]) -> List[Item]:
    
    # 获得顶级节点
    treeNode = list(filter(lambda item: item.pid is None, items))
    
    for node in treeNode:
        node.children = get_children(node, items)

    return treeNode


def get_children(root:Item, items:List[Item]) -> Item:
    children = []
    for item in items:
        if item.pid  == root.id:
            item.children = get_children(item, items)
            children.append(item)
    return children

其实这里用到了递归的方式,先获得所有的第一级节点,然后根据第一层节点的id去匹配子级的id。这样重复的步骤,就可以使用递归来实现了,递归的终止条件就是item.pid != root.id。这个代码shigen目前已经写到最简洁了,还有其它的优化思路的,也欢迎评论区交流一下。

最后贴上我的python代码实现截图:

python代码实现

好了,以上就是shigen和大家分享的树形结构的快速生成的全部内容了。

shigen一起,每天不一样!

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

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

相关文章

工程师使用IT服务台软件可以解决哪些问题?

现如今企业数字化建设已初具规模&#xff0c;业务系统基本已告一段落&#xff0c;而下一步关注的重点则从技术转向管理&#xff0c;如何能让这些系统更好运行起来&#xff0c;如何提高管理效率已是重中之重。在此向您推荐一款高效的IT服务管理工具——ServiceDesk Plus&#xf…

elementui的el-tabs标签页样式修改

一、官网样式&#xff1a; 二、修改样式 1.去掉下划线 效果&#xff1a; 代码: /* 去掉tabs标签栏下的下划线 */ ::v-deep .el-tabs__nav-wrap::after {position: static !important;/* background-color: #fff; */ } 2.改变下划线颜色 效果&#xff1a; 代码&#xff1a;…

使用VisualStudio制作上位机(三)

文章目录 使用VisualStudio制作上位机(三)第三部分:GUI内部函数设计使用VisualStudio制作上位机(三) Author:YAL 第三部分:GUI内部函数设计 这一部分,主要实现CAN设备的打开 将CAN厂家的二次开发文件添加到工程里调用相关函数打开或关闭CAN首先,添加“类文件”,类主…

死锁的典型情况、产生的必要条件和解决方案

前言 死锁&#xff1a;多个线程同时被阻塞&#xff0c;他们中的一个或全部都在等待某个资源被释放。由于线程被无限期地阻塞&#xff0c;因此程序不可能正常终止。 目录 前言 一、死锁的三种典型情况 &#xff08;一&#xff09;一个线程一把锁 &#xff08;二&#xff09;…

聊一聊a_bogus

前言 可以关注我哟&#xff0c;一起学习&#xff0c;主页有更多练习例子 如果哪个练习我没有写清楚&#xff0c;可以留言我会补充 如果有加密的网站可以留言发给我&#xff0c;一起学习共享学习路程 如侵权&#xff0c;联系我删除 此文仅用于学习交流&#xff0c;请勿于商用&a…

保护隐私为先的话,最好是不登录用ChatGPT,6种方法助你轻松接入-纯分享

ChatGPT是OpenAI研发的强大AI语言模型&#xff0c;用户可以通过它进行有意义的对话&#xff0c;并获取问题解答。但是&#xff0c;一些用户可能更倾向于在不需要创建账号或不登录的情况下使用ChatGPT。在这篇指南中&#xff0c;我们将探讨各种无需账号即可访问ChatGPT的方法。无…

续二:《你的医书是假的!批评付施威的《DDD诊所——聚合过大综合症》

DDD领域驱动设计批评文集 “软件方法建模师”不再考查基础题 《软件方法》各章合集 我写了一篇文章&#xff0c;批评付施威的《DDD诊所——聚合过大综合症》&#xff08;以下简称《DDD诊所》&#xff09;&#xff0c;文章是《你的医书是假的&#xff01;批评付施威的《DDD诊…

【AI模型】Windows端深度学习环境配置

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍Windows端深度学习环境配置。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次更新不…

zhm_real/MotionPlanning运动规划库中A*算法源码详细解读

本文主要对zhm_real/MotionPlanning运动规划库中A*算法源码进行详细解读&#xff0c;即对astar.py文件中的内容进行详细的解读&#xff0c;另外本文是 Hybrid A * 算法源码解读的前置文章&#xff0c;为后续解读Hybrid A * 算法源码做铺垫。 astar.py文件中的源码如下&#xff…

python pipenv环境部署django项目实践

将代码上传到服务器&#xff1a; 安装pipenv&#xff1a; pip3 install pipenv 安装项目虚拟环境&#xff1a; cd /www/wwwroot/python-django pipenv install 如果提示python版本问题&#xff0c;修改Pipfile文件内的python版本即可。 然后进入虚拟环境安装依赖包&#x…

Java学数据结构(1)——抽象数据类型ADT 表List、栈Stack和队列Qeue

目录 引出抽象数据类型&#xff08;abstract data type,ADT&#xff09;表ListArrayList,Vector, LinkedListArrayList手动实现与分析Vector的分析&#xff08;线程安全&#xff09;LinkedList 的手动实现与分析 栈stack—后进先出java中stack源码分析栈的应用&#xff1a;检查…

Android 市场的变化,影响多少开发被迫……

前言 Android 开发在2010年时&#xff0c;广受市场需要&#xff0c;那时候在一线城市很容易拿到10K的起步薪资&#xff0c;Android开发的市场空缺大概有30万左右。那时引起了大量java开发者开始学习Android开发&#xff0c;招聘市场面试要求上只要有一定java语法基础&#xff…

使用Nodejs创建简单的HTTP服务器,借助内网穿透工具实现公网访问的方法分享

文章目录 前言1.安装Node.js环境2.创建node.js服务3. 访问node.js 服务4.内网穿透4.1 安装配置cpolar内网穿透4.2 创建隧道映射本地端口 5.固定公网地址 前言 Node.js 是能够在服务器端运行 JavaScript 的开放源代码、跨平台运行环境。Node.js 由 OpenJS Foundation&#xff0…

淘宝销量采集(淘宝店的销售数据如何获取),淘宝API接口申请指南

淘宝销量采集是在网络商业流程中的一个非常重要的环节&#xff0c;可以帮助商家更好地了解市场的消费状况和竞争情况。通过对淘宝商品的销量数据进行采集与分析&#xff0c;商家可以有效地了解市场上的热销商品、竞争情况、市场价格趋势等重要信息&#xff0c;从而制定相应的营…

【DevOps视频笔记】4.Build 阶段 - Maven安装配置

一、Build 阶段工具 二、Operate阶段工具 三、服务器中安装 四、修改网卡信息 五、安装 jdk 和 maven Stage1 : 安装 JDK Stage 2 : 安装 Maven 2-1 : 更换文件夹名称 2-2 : 替换配置文件 settings.xml- 2-3 : 修改settings.xml详情 A. 修改maven仓库地址 - 阿里云 B…

RISC-V IOPMP实际用例-Andes SoC‘s Rapid-k模型

安全之安全(security)博客目录导读 2023 RISC-V中国峰会 安全相关议题汇总 说明&#xff1a;本文参考RISC-V 2023中国峰会如下议题&#xff0c;版权归原作者所有。

Tomcat漏洞复现+哥斯拉利用

Tomcat 8 启动tomcat8漏洞 将jsp木马保存到zip压缩包中&#xff0c;再修改后缀名为war上传 <%page import"java.util.*,javax.crypto.*,javax.crypto.spec.*"%><%!class U extends ClassLoader{U(ClassLoader c){super(c);}public Class g(byte []b){retu…

prometheus监控JVM(接入tomcat)

一、整合jmx_exporter及tomcat 1、 jmx_exporter下载地址 https://github.com/prometheus/jmx_exporter/releases 2、 tomcat配置文件下载地址 https://github.com/prometheus/jmx_exporter/blob/main/example_configs/tomcat.yml 3、创建tomcat_exporter目录 [rootlocalhost ~…

怎么快速生成gif?三步教你一键生成gif动图

相信大家都有使用过表情包吧&#xff0c;那么自己怎么将图片转gif动图表情包呢&#xff0c;其实很简单&#xff0c;只要使用这款在线gif制作&#xff08;https://www.gif.cn&#xff09;工具&#xff0c;就可以一键生成gif动图&#xff0c;下面一起来看看。 打开网站&#xff…

让家长自己动手,轻松查询分班信息

暑假即将结束&#xff0c;老师们面临着制作分班信息查询系统的重要任务。今天给大家推荐的这个工具对于老师们来说非常重要&#xff0c;因为它可以提供给家长和学生们方便快捷的查询服务。 分班信息查询系统可以让家长和学生们通过系统查询自己所在的班级、同班同学的信息以及班…