如何按照表格的确切顺序迭代表格?
2015-6-23 7:7:55
收藏:0
阅读:78
评论:4
如果我尝试输出此表格,则它们会按错误顺序循环:
local letters = {DIN1="hi", AIN1= "my", AIN2 ="name", DIN2="is"}
for name, value in pairs(letters) do
print(name,value)
end
期望的输出:
DIN1 hi
AIN1 my
AIN2 name
DIN2 is
输出:
AIN1 my
DIN2 is
DIN1 hi
AIN2 name
如何编写代码,使for循环按照表的实际顺序运行?(按照定义的顺序)
编辑:我不需要按字母顺序排列,而是按表的定义顺序排列。
编辑:我需要打印键和值。 在答案“以与编写相同顺序的Lua成对出现”中,只会打印索引号和值。
点赞
用户3125367
您可以使用表的整数部分来按顺序存储键:
function add(t, k, v, ...)
if k ~= nil then
t[k] = v
t[#t+1] = k
return add(t, ...)
end
return t
end
t = add({ }, "A", "hi", "B", "my", "C", "name", "D", "is")
for i,k in ipairs(t) do
local v = t[k]
print(k, v)
end
当然,这假定整数键除了 add 之外没有被其他东西使用。
insert(t, k, v) 和 remove(t, k) 留给读者练习。
编辑:
add 函数中的省略号(点)允许传递尽可能多的参数来一次性设置多个键值对。如果没有省略号,我们只能在每次调用时设置一个 pair,像这样 add(t, "A", "hi")。函数定义 add(t, k, v, ...) 将前三个参数分配给 t, k, v,并保持其他参数不变。然后 add 处理第一对(t[k]=v)并将剩下的 ... 参数递归地处理。
t k v ...
level 1: (t, "A", "hi", "B", "my", "C", "name", "D", "is")
level 2: (t, <- "B", "my", "C", "name", "D", "is")
level 3: (t, <- "C", "name", "D", "is")
level 4: (t, <- "D", "is")
level 5: (t, <- )
在第 5 级,k 和 v取 nil,因为参数列表太短,递归停止。
2015-06-22 10:39:03
用户577603
Lua-users 的 Wiki 上有一个页面来解决这个问题。
引用该页面上的代码:
--[[
Ordered table iterator, allow to iterate on the natural order of the keys of a
table.
Example:
]]
function __genOrderedIndex( t )
local orderedIndex = {}
for key in pairs(t) do
table.insert( orderedIndex, key )
end
table.sort( orderedIndex )
return orderedIndex
end
function orderedNext(t, state)
-- Equivalent of the next function, but returns the keys in the alphabetic
-- order. We use a temporary ordered key table that is stored in the
-- table being iterated.
key = nil
--print("orderedNext: state = "..tostring(state) )
if state == nil then
-- the first time, generate the index
t.__orderedIndex = __genOrderedIndex( t )
key = t.__orderedIndex[1]
else
-- fetch the next value
for i = 1,table.getn(t.__orderedIndex) do
if t.__orderedIndex[i] == state then
key = t.__orderedIndex[i+1]
end
end
end
if key then
return key, t[key]
end
-- no more value to return, cleanup
t.__orderedIndex = nil
return
end
function orderedPairs(t)
-- Equivalent of the pairs() function on tables. Allows to iterate
-- in order
return orderedNext, t, nil
end
这里的“键的自然顺序”指的是从最小的键(就好像通过a<b样式的比较来确定)开始,这不一定是您在填充表时首先写的键(后者更为复杂,也更不合理)。
然后您可以直接使用orderedPairs函数来替换pairs:
local letters = {A="hi", B= "my", C ="name", D="is"}
for name, value in orderedPairs(letters) do
print(name,value)
end
2015-06-22 11:02:42
用户107090
为了说明,没有确切的顺序。
Lua 中的表是一组键值对。表定义只是为了一次性设置多个键值对的简写。只有当有重复的键时,键值对被定义的顺序才有关系:最后一个相同键的键值对是留在表中的。
2015-06-22 14:22:51
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的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中获取用户配置主目录的跨平台方法
我用以下代码绕开了此问题,但这个解决方案当然不是完美的。
local letters = {"DIN1=hi", "DIN2 = my", "AIN1 = name", "LE = is" } local pattern = "(%S+)%s*=%s*(%S+)" for _, n in pairs(letters) do key, value = n:match(pattern) print(key, value) end输出结果:
DIN1 hi DIN2 my AIN1 name LE is