AI 告诉你 一行代码生成树形结构

一、前言

  1. 在我们日常开发中生成树形结构是无可避免的,比如权限管理的层级结构,学校企业的组织结构以及我们日常开发的菜单列表等等。
  2. 我最近看到过一篇文章,在面试的过程中,会被要求手写一下如何根据扁平的数据结构生成一个树形结构,结果却不尽人意只有 20% ~ 30% 的人能够高效并快速的写出,有些人只是知道使用递归,却不能写出,只有在提醒下才勉强写出,更甚至有少部分人在提醒下都不能理解写出。
  3. 甚至在评论区竟然出现了一些恶搞的评论,我也是沉浸在其中:这些东西都是八股文都是应试用的;后端的好兄弟:我们都直接让前端自己处理;前端的 homie :后端返回给我们的都是树形结构我们不需要处理,只需要渲染一下就可以了。What?我是甩锅侠!!!

这篇文章将会使用 Java 和 JavaScript 以及结合 ChatGPT 和我对生成树形结构的理解,结合 JavaScript 和Java 的语法糖来生成一下树形结构,从此让我们走向背锅侠的道路 ( doge ) 。

二、生成树形结构的方式

1、 数据准备

首先我们初始化一些数据,用来为我们之后生成树形结构作基础,这里的结构都是很简单的,只要会一点面向对象的基础都可以很容易的生成, 为了简单起见,我将去除其中一些复杂的操作,比如Java中各种O的转化,以及真实场景中的复杂的业务逻辑,只专注于根据 id 和 pid 生成树形结构。

在这里插入图片描述

2、递归方式

温馨提示 : 在编码过程中,我使用了 Java 和 JavaScript 中的一些语法糖,比如 Java 中的 Stream 流操作以及 JavaScript 中的一些 数组的 forEach()、map()、filter()、find(),数组以及对象的解构赋值等等,如果你还没有掌握的话,需要抓紧了,因为这是在开发中再常见不过的方法了。

使用递归的方式其实是对语言本身方法栈的调用:主要抓住三个点:

(1)我们在理解问题的时候不能钻进程序具体调用的细节中去,我们要从宏观进行理解,如果你要

进行断点调试,在同一个方法中反复横跳,不晕才怪。

(2)我们要将大的问题拆解为小的子问题,小的子问题和大的问题调用过程是相同的。

(3)我们要找到最小子问题的递归出口(结束条件)。

在这里插入图片描述
在这里插入图片描述
代码示例:

public static List<TreeNode> toTreeRecursion(Long pid, List<TreeNode> list) {ArrayList<TreeNode> result = new ArrayList<>();list.forEach(item -> {if (item.getPid().equals(pid)) {result.add(item);}});// 递归出口result.forEach(item -> item.setChildren(toTreeRecursion(item.getId(), list)));return result;}
const createTreeRecursion = (id,list) => {let children = list.filter(item => id === item.pid)children.forEach(child => {child.children = createTree(child.id,list)})return children}

当我们没有头绪的时候我们可以寻求智能 AI 的帮助,可能会有意想不到的收获:
在这里插入图片描述

3、一行代码递归方式

我们该如何简化我们的代码,我们可以寻求我们的好兄弟 ChatGPT 的帮助。
在这里插入图片描述

这种的代码结构其实是有很多种的实现,你可以根据自己的想法进行任意转化,比如下面是我的想法:
在这里插入图片描述
能写出机器理解的代码很容易,但是我们需要写出人能够理解的代码。同时我们以看出 ChatGPT也是不推荐我们去这样写。与此同时,在复杂的业务逻辑中写出这样的代码也是不可能的。

4、Map方式

在使用递归的方式进行生成树形结构时,可以从宏观的理解生成树形结构的过程,但是树形结构毕竟是的重复调用,时间复杂度为 log(2^n) ,随着数据量的增多,还是需要进行优化的,我们可以使用 Map 的方式,使其时间复杂度达到 log(n)
请添加图片描述
代码示例:

public static List<TreeNode> toTreeMap(List<TreeNode> list) {// 第一次遍历Map<Long, TreeNode> map = list.stream().collect(Collectors.toMap(TreeNode::getId, item -> item));List<TreeNode> result = new ArrayList<>();// 第二次遍历list.forEach(item -> {if (map.get(item.getPid()) == null) {result.add(item);} else {List<TreeNode> children = item.getChildren();if (children == null) {item.setChildren(new ArrayList<>());}map.get(item.getPid()).getChildren().add(item);}});return result;
}
const crateTreeMap = (data) => {// 创建一个maplet map = {}// 第一次遍历data.forEach(item => {map[item.id] = item})// 第二次遍历let result = []data.forEach(item => {let parent = map[item['pid']]if (parent) {(parent.children || (parent.children = [])).push(item)}else {result.push(item)}})return result}

三、总结

  1. 在日常的编码中,生成树形结构还是很常见的,无论是为了应付面试,还是强化我们的编码思想都是十分的关键的,所以让我们一起掌握树形结构的操作吧,来做我们自己的背锅侠。
  2. 在思考的过程中要多方面的思考,可以结合多门编程语言,每个语言都有每个语言的特色,当时其基本的底层逻辑都是十分相似的,我印象很深刻的点是:在学习Netty的时候发现像一些异步任务、事件循环机制以及Promise, 与浏览器的 EventLoop 和JavaScript中的Promise()都是大同小异的。
    欢迎大家在评论区留下自己的看法!!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

巴比特 | 元宇宙每日必读:AI概念股集体大跌、光年之外卖给美团、ChatGPT也涨不动了,大模型热潮正在降温?创业者如何抉择?...

摘要&#xff1a;据甲子光年报道&#xff0c;在高喊“要做中国版OpenAI”之后的第136天&#xff0c;王慧文把光年之外卖给了美团。从整体商业视角看&#xff0c;光年之外被美团收购只是企业间常见的收购动作。但对于国内AI行业来说&#xff0c;这笔收购似乎预示着仅火热半年的A…

ChatGPT来了,全国百万打工人都慌了......

关注我们丨文末赠书 如果说上个月AIGC的热度还只停留在技术圈&#xff0c;那么最近AIGC的影响力已经辐射到普通打工人了&#xff01; 4月18日&#xff0c;国内办公软件巨头金山正式发布了生成式人工智能应用WPS AI&#xff0c;这也是国内协同办公赛道首个类ChatGPT式应用&#…

BSP按键适配

笔记目录 GPIO按键适配PS&#xff1a;每次修改适配都要再客制化一下,来更新修改。&#xff01;&#xff01;&#xff01;一、GPIO按键适配&#xff08;Rk&#xff09;linux键值二、GPIO适配&#xff1a;RK平台&#xff08;android11&#xff09;调试&#xff1a;1、adb命令打开…

ubuntu和ros安装后的初始化

huanyu机器人学习&#xff0c;要把代码学会 分区规则&#xff1a;以350G左右为例 找到空闲&#xff1a; ext4→efi 逻辑分区 1G ext4→交换空间 逻辑分区 30/32G&#xff08;按照内存选&#xff0c;16G用32&#xff09; 挂载点→ / → 主分区 →100G 挂载点→/usr → 逻辑分区…

AI小作文搞崩科大讯飞股价 科技“魔法”反噬科企

5月24日午后&#xff0c;A股公司科大讯飞的股价突然走出深V造型&#xff0c;闪崩8%。科大讯飞回应称&#xff0c;股价下跌系某生成式AI写作虚假小作文导致&#xff0c;谣传风险为不实消息。 网传的一篇“小作文”谣称“科大讯飞被曝采集用户隐私数据研究人工智能引发争议”&am…

1月安全月报 | 2亿Twitter用户数据被公开;美计划发起“黑掉五角大楼3.0”漏洞赏金计划

目录 国外安全热点 &#x1f449;安全政策 &#x1f449;数据安全 &#x1f449;市场趋势 &#x1f449;勒索事件 国内安全热点 &#x1f449;数据安全 &#x1f449;业务安全 &#x1f449;移动安全 &#x1f449;网安政策 为了让大家更全面的了解网络安全的风险&am…

上下文工程:基于 Github Copilot 的实时能力分析与思考

上个月在计划为 AutoDev 添加多语言支持时候&#xff0c;发现 GitHub Copilot 的插件功能是语言无关的&#xff08;通过 plugin.xml 分析&#xff09;&#xff0c;便想研究一下它是如何使用 TreeSitter 的。可惜的是&#xff0c;直到最近才有空&#xff0c;研究一下它是如何实现…

零门槛复现ChatGPT:预训练模型数据集直接用,包含完整RLHF流程,在线可体验...

明敏 发自 凹非寺量子位 | 公众号 QbitAI 这边ChatGPT、GPT-4等AI大模型和应用打得火热&#xff1b; 另一边“平替”开源复现方案也加紧更新迭代。 这不&#xff0c;“首个开源ChatGPT低成本复现流程”就来了波大更新&#xff01; 现在&#xff0c;仅需不到百亿参数&#xff0c…

面试的三种形式

对于面试大家都不会陌生&#xff0c;大大小小的面试也都经历过&#xff0c;有过不是很正规的&#xff0c;也有过让自己大开眼界的大型面试&#xff0c;但无外乎三种形式电话面试&#xff0c;共享桌面远程面试&#xff0c;现场面试。但是在这几种面试的场合中&#xff0c;我们到…

shp文件批量导入SDE

仿照ArcGIS的数据导入功能做了个简易的数据导入界面&#xff1a; 需要注意的问题&#xff1a;上篇博文中的要素类导入函数要变成静态函数&#xff0c;不然会报错。原因我想可能是因为非静态函数导入时&#xff0c;workspace与workspacefactory等类型变量未释放&#xff0c;希望…

Oracle 配置Linux环境 ArcGIS Server 64位客户端创建SDE

1. 环境情况 oracle数据库 11_2 g所在服务器环境&#xff1a; Windows Server 2016虚拟机&#xff0c;默认实例orcl &#xff0c;默认密码orclServer所在服务器环境&#xff1a;ArcGIS Server10.8.1&#xff0c;CentOS7.5虚拟机&#xff0c;64位Instant客户端本机ArcMap10.8.1…

如何快速搭建基于PostgreSQL的空间数据库(SDE)

如何快速搭建基于PostgreSQL的空间数据库&#xff08;SDE&#xff09; 1 安装准备 1.1 ArcGIS平台 ArcGIS Desktop 10.5以及ArcGIS Enterprise 10.5。 1.2 数据库 ArcGIS 支持以下PostgreSQL 和 PostGIS 版本。列出的特定版本为支持的最低次要版本&#xff0c;受支持…

SDE数据库解锁

SDE数据库解锁 arcgis sde数据库解锁 方法一&#xff1a;登录修改数据用户&#xff0c;选择数据上层数据集或数据库 选择一行数据右键解锁&#xff0c;shift选择多行数据解锁 方法二&#xff1a;plsql 数据库语句解锁数据库 select * from sde.state_locks; select * from s…

sde用sql实现erase

概述&#xff1a; 本文讲述基于Arc SDE forOracle实现erase空间分析计算。 实现流程&#xff1a; 1、叠加计算 判断叠加&#xff0c;非叠加部分即为一部分所要结果&#xff0c;叠加部分进入第二步&#xff1b; 2、合并计算 根据objectid进行union计算&#xff1b; 3、差异…

SDE常用函数

SDE常用函数 arcgis sde库常用函数&#xff1a;&#xff08;示例使用Oracle数据库&#xff09; 1、ST_AsText 返回表示几何的文本字符串(wkt) sde.st_astext(shape) SELECT SDE.ST_ASTEXT(SHAPE) FROM TEXT结果&#xff1a; 2、ST_Geometry ST_Geometry 通过文本(wkt,坐…

Sentaurus SDE

Sentaurus SDE visual

sde方面的一些疑问(笔记)

sde&#xff1a; &#xff08;1&#xff09;ArcSDE 服务自 ArcGIS 10.3 起不再可用。但是&#xff0c;ArcGIS 10.3.1 和更高版本的客户端仍可以使用 ArcSDE 服务连接到 10.1 或 10.2.x 版本的地理数据库。 http://desktop.arcgis.com/zh-cn/arcmap/latest/manage-data/admini…

Sentaurus TCAD学习之SDE

Sentaurus TCAD学习之Sde 分析IGBT例子中SDE代码 分析IGBT例子中SDE代码 ; Using DF-ISE coordinate system for structure generation //使用DF-ISE坐标系生成结构 (sde:set-process-up-direction "z");---------------------------------------------------------…

SDE:Stochastic Differential Equation 简述

一、ODE vs. SDE 常微分方程(ODE)的基本形式为&#xff1a; 一般来说其解是一条确定的曲线&#xff0c;而随机微分方程(SDE)&#xff0c;其结果是一个随机的过程&#xff0c;最终得到是的多种样本轨道。 那么在ODE方程里加入随机性主要有两种方式&#xff1a; 1、随机化初值…

ArcEngine连接sde并读取数据

第一步&#xff1a;创建空数据库 打开SQL Server 2012&#xff0c;新建一个空的数据库&#xff0c;我这里命名为TestGDB 第二步&#xff1a;建立SDE数据库 打开ArcMap&#xff0c;在ArcToolbox中选择数据管理工具下的地理数据库管理&#xff0c;点击创建企业级地理数据库。…