lua - 如何按值对表进行排序,然后按顺序打印索引
问题描述
我想t
使用以下格式创建一个表。
t[uniqueID] = order
将uniqueID
是唯一的,但order
每次都可以相同或不同。
然后我想按升序对表格进行排序,以便我可以uniqueID
相应地打印。
我的代码:
t = {}
function compare(a, b)
return a[2] < b[2]
end
function printid()
for k, v in pairs(t) do
print(k)
end
end
function main()
t[5] = 47
t[6] = 45
t[7] = 49
table.sort(t, compare)
printid()
end
我得到的结果:
5
6
7
我期望的结果:
6
5
7
我怎样才能得到我想要的结果?
解决方案
来自“Lua 编程”第19.3 节“排序”</a>。
一个常见的错误是尝试对表的索引进行排序。在表中,索引形成一个集合,并且没有任何顺序。
这意味着您必须将表对t
放入另一个sorted
具有连续索引的表中。然后可以根据您定义的谓词对该表进行排序。此外,您必须ipairs
在迭代连续索引表时使用,因为pairs
未指定顺序。
local t = {}
t[5] = 47
t[6] = 45
t[7] = 49
local sorted = {}
for k, v in pairs(t) do
table.insert(sorted,{k,v})
end
table.sort(sorted, function(a,b) return a[2] < b[2] end)
for _, v in ipairs(sorted) do
print(v[1],v[2])
end
推荐阅读
- c - fprintf 对时间戳计数器有奇怪的影响
- c# - 登录后如何根据角色将用户重定向到不同的主页?
- node.js - 未处理的承诺拒绝警告。Passport.js
- python - 使用 openCV 通过网络摄像头制作实时草图
- javascript - 将日期传递给 componentDidMount 中的函数
- ruby-on-rails - 基于一些计算逻辑更新数据库属性
- jestjs - 如何检索子组件的实例
- unity3d - 从 2d 视频添加背景创建 360
- jenkins - 如何调试 NUnit 仅在 CI 构建中失败?
- rest - 创建最佳 API:上传 N 个文件和 json 元数据