news 2026/6/11 23:22:44

Convert2ModuleNameTreeNode讲解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Convert2ModuleNameTreeNode讲解

先看问题:为什么需要这个东西?

程序里有一个ModuleList,它是一份平铺的、顺序的模块清单。比如用户拖出来的流程可能是这样的:

[拍照] [如果 检测到瑕疵] [打标模块] [否则] [忽略模块] [结束] [保存结果]

但在代码里,这个ModuleList存的是一维数组,没有父子关系:

索引0: "拍照" 索引1: "如果 检测到瑕疵" 索引2: "打标模块" 索引3: "否则" 索引4: "忽略模块" 索引5: "结束" 索引6: "保存结果"

如果只是从头到尾跑一遍,那很简单。但问题来了——执行时需要根据结果跳转。比如"如果 检测到瑕疵"结果是 false,就要跳过"打标模块"和"否则"和"忽略模块",直接跳到"结束"后面的"保存结果"。这时候系统需要知道:

  • "打标模块"的父级是谁?(“如果”)
  • "打标模块"的同级兄弟有哪些?(“打标模块”、"否则"等)
  • “结束"之后是什么?(跳到父级的兄弟"保存结果”)

Convert2ModuleNameTreeNode()就是把平铺列表变成一棵树,让程序能回答上面这些问题。


核心数据结构

就两个东西:

Stack<ModuleNameTreeNode>— 一个栈,栈顶永远指向"当前我属于哪个父级"

ModuleNameTreeNode— 每个节点只存三样:名字、父节点引用、子节点列表


算法:一步步模拟

假设输入(一维列表)是:

[拍照] [如果瑕疵] [标记] [否则] [忽略] [结束] [保存]

栈初始为空[]。逐个遍历:

步骤当前模块栈(之前)操作栈(之后)
1拍照[]不是"开始"类型,栈不变。父级=BaseTreeNode(根)[]
2如果瑕疵[]是"如果"→压栈。父级=BaseTreeNode[如果]
3标记[如果]不是开始类型。父级=栈顶即"如果"[如果]
4否则[如果]是"否则"→先弹栈(结束"如果"分支),再压栈。父级=[]即根[否则]
5忽略[否则]不是开始类型。父级=栈顶即"否则"[否则]
6结束[否则]是"结束"→弹栈。父级=[]即根[]
7保存[]不是开始类型。父级=根[]

最终构建出的树结构:

(根 BaseTreeNode) ├── 拍照 (Parent=根) ├── 如果瑕疵 (Parent=根, ChildList=[标记]) │ └── 标记 (Parent=如果) ├── 否则 (Parent=根, ChildList=[忽略]) │ └── 忽略 (Parent=否则) ├── 结束 (Parent=根) └── 保存 (Parent=根)

这东西实际怎么被使用的

在项目执行的主循环中,ModuleTreeNodeMap被频繁查询:

条件分支跳转— [Project.cs:595](/D:\JGTechVision\GJTechVisionV1.0.0\01_Sourse - 0604-2\VM\01Main\VM.Start\Services\Project.cs:595)

ModuleTreeNodeMap["打标模块"].Parent.ChildList → 得到 ["标记", "否则", "忽略", "结束"]

条件失败时,遍历这个列表跳过所有兄弟,找到"结束"之后继续。

循环跳转— [Project.cs:620](/D:\JGTechVision\GJTechVisionV1.0.0\01_Sourse - 0604-2\VM\01Main\VM.Start\Services\Project.cs:620)

同理,停止循环模块通过ModuleTreeNodeMap[name].Parent.Parent.ChildList找到"循环结束"的位置然后跳出。

一句话总结:把用户可视化的嵌套流程(如果/否则/循环/文件夹),翻译成代码能理解的树结构,让执行引擎知道谁是谁的孩子、谁是谁的兄弟,从而正确跳转。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/11 23:16:57

MPC7447A处理器硬件设计实战:从规格书解读到电源、时钟与热设计

1. MPC7447A处理器&#xff1a;从规格书到实战的深度解析在嵌入式系统开发&#xff0c;尤其是涉及高性能计算、网络通信或工业控制领域时&#xff0c;选对一颗“心脏”——微处理器——只是第一步。真正考验工程师功力的&#xff0c;是如何让这颗心脏在目标系统中稳定、高效且长…

作者头像 李华
网站建设 2026/6/11 23:16:55

GEKKO优化:从局部到全局的探索之旅

在优化问题中,找到全局最优解常常是一项挑战。GEKKO作为一种流行的非线性优化求解器,通常会陷入局部最优解。本文将通过实际的代码示例,展示如何使用多种策略来帮助GEKKO避免局部最优,进而找到全局最优解。 问题背景 假设我们有一个优化问题,我们希望最大化simu_total_v…

作者头像 李华
网站建设 2026/6/11 23:12:54

Kubernetes etcd 运维与灾备:从集群状态管理到数据恢复的实战

Kubernetes etcd 运维与灾备&#xff1a;从集群状态管理到数据恢复的实战一、etcd 故障的连锁反应&#xff1a;控制平面的单点风险 etcd 是 Kubernetes 控制平面的唯一状态存储后端&#xff0c;所有资源对象&#xff08;Pod、Service、ConfigMap 等&#xff09;的声明式状态都持…

作者头像 李华
网站建设 2026/6/11 23:12:51

Ice:macOS菜单栏管理的技术实践与效率优化

Ice&#xff1a;macOS菜单栏管理的技术实践与效率优化 【免费下载链接】Ice Powerful menu bar manager for macOS 项目地址: https://gitcode.com/GitHub_Trending/ice/Ice 在macOS生态系统中&#xff0c;菜单栏作为系统级交互界面&#xff0c;承载着大量应用程序的快捷…

作者头像 李华
网站建设 2026/6/11 23:11:56

Electron-Vue3跨平台音乐播放器架构解析与实现原理

Electron-Vue3跨平台音乐播放器架构解析与实现原理 【免费下载链接】lx-music-desktop 一个基于 Electron 的音乐软件 项目地址: https://gitcode.com/GitHub_Trending/lx/lx-music-desktop 洛雪音乐助手是一个基于Electron 30和Vue 3构建的高性能跨平台音乐播放器&…

作者头像 李华
网站建设 2026/6/11 23:05:58

单点登录的基石:OAuth 2.1 与 OpenID Connect 如何编织安全可信的身份网络

身份,是数字世界的通行证。当一名员工每天在不同业务系统间反复输入密码,当用户在十几个独立网站疲于注册,一种强烈的技术冲动便会出现:能否只登录一次,就能畅行所有应用?这就是单点登录(SSO)的朴素愿景。而实现这一愿景的现代基石,并非某个单一的协议,而是一对配合默…

作者头像 李华