Lua - 如何按值排序表
2015-9-12 8:40:44
收藏:0
阅读:112
评论:2
我正在寻找一种按其值链(values chain)对 Lua 表进行排序的方法。例如,给出该表:
local vals = {
{ id = "checkpoint4" },
{ id = "checkpoint1", nextid = "checkpoint2" },
{ id = "checkpoint3", nextid = "checkpoint4" },
{ id = "checkpoint2", nextid = "checkpoint3" },
}
排序后,应该变成:
local vals = {
{ id = "checkpoint1", nextid = "checkpoint2" },
{ id = "checkpoint2", nextid = "checkpoint3" },
{ id = "checkpoint3", nextid = "checkpoint4" },
{ id = "checkpoint4" },
}
它们的名称并非完全相同,可能会有所变化。我想要比较“checkpoint”后面的数字,但结果发现我必须使用这种动态的表格(已按照我想要的方式排序):
local vals = {
{ id = "checkpoint1", nextid = "cp" },
{ id = "cp", nextid = "chp" },
{ id = "chp", nextid = "mynextcheckpoint" },
{ id = "mynextcheckpoint"},
}
谢谢。
点赞
用户1847592
local id2val, tailsizes = {}, {}
-- 创建 id2val 和 tailsizes 空表
for _, val in ipairs(vals) do id2val[val.id] = val end
local function tailsize(val) -- memoized calculation of tails sizes
-- 根据表中是否存在 val 键来判断是否进行后面的操作
if not tailsizes[val] then
tailsizes[val] = 0 -- cycle-proof
-- 判断表中是否存在 nextid 和 id2val,如果判断未通过,则不进行计算
if val.nextid and id2val[val.nextid] then -- dangling nextid proof
tailsizes[val] = tailsize(id2val[val.nextid]) + 1
end
end
return tailsizes[val]
end
-- 根据尾部长度进行排序
table.sort(vals, function(a,b) return tailsize(a) > tailsize(b) end)
2015-04-22 11:26:58
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
你所描述的被称为topological sorting。然而,因为这是一个受限制的情况,我们不必实现一个完整的topological sorting算法:
function sort_list(tbl) local preceding = {} local ending local sorted = {} for i, e in ipairs(tbl) do if e.nextid == nil then ending = e else preceding[e.nextid] = i end end if ending == nil then return nil, "no ending" end local j = #tbl while ending ~= nil do sorted[j] = ending ending = tbl[preceding[ending.id]] j = j - 1 end if sorted[1] == nil then return nil, "incomplete list" end return sorted end使用方法:
local sorted = sort_list(vals)