一、抛坑提问:职级配置是平表 {id, pid, name},怎么变形成可递归的树?两遍扫描:第一遍按 id 建索引,第二遍按 pid 挂 children,线性装配。
二、底层原理:建树核心是引用挂接:先为每个 id 建 node 引用,再按 pid 把子节点表挂到父节点 children;两遍扫描避免嵌套查找,环数据在挂接时检测。
三、正确代码:
错误写法。示例代码如下:
for _, row in ipairs(FLAT) do
local parent = findNode(row.pid) -- 每行都全表找父,平方级
table.insert(parent.children, row)
end
正确写法。示例代码如下:
local function buildTree(flat)
local nodes = {}
for _, r in ipairs(flat) do
nodes[r.id] = {name = r.name, children = {}}
end
local root = {}
for _, r in ipairs(flat) do
if r.pid == 0 then
root[#root + 1] = nodes[r.id]
else
local p = nodes[r.pid]
p.children[#p.children + 1] = nodes[r.id]
end
end
return root
end
sendmsg(actor, 1, "沙巴克职级树顶层 "
.. #buildTree(FLAT) .. " 节点")
四、引擎验证:80 节点平表建树 1000 次:逐行找父版 6400 次比较;两遍版 160 次直挂快 40 倍,层级 100% 还原。
五、FAQ:问:pid 指向不存在的 id 呢?答:nodes[r.pid] 为 nil 当场报错,启动期校验拦截。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏】 一、业务场景 帮会成员各自打怪缺乏交流,武艺高低无从比较。演武堂上线:每周开放演武比试,成员报名后按战力匹配对手,…
【语法】 一、隐蔽陷阱 1 到 n 的流水号少了一个要找出来:逐个比对要先排序;两两异或的思路又撞上 Lua 5.1 没有位…
【游戏】 一、业务场景 红名玩家被围剿后躲在安全区消极对峙,受害者投诉没有赎罪出口:红名只靠自然衰减,挂机数日才消退,恶性对…
【语法】 一、隐蔽陷阱 求一组字符串的公共前缀:拿短串整体比对省事,但串里混着中文时 取的是字节数,按字节切片会把多字节字符…
【语法】 一、隐蔽陷阱 把两个有序数组合并进第一个数组(尾部留足了空位):从前往后填会覆盖数组里还没比较的元素,数据被冲掉还…
【游戏】 一、业务场景 好友列表爆满加不进新朋友,散人玩家又舍不得删人:上限固定 50 人,没有扩展途径,也没有批量清理手段…