如何获取 Lua 表中的条目数量?
听起来像是个 "让我帮你谷歌一下" 的问题,但不知道为什么我找不到答案。 Lua 的 #
运算符只计算带有整数键的条目,table.getn
也是如此:
tbl = {}
tbl["test"] = 47
tbl[1] = 48
print(#tbl, table.getn(tbl)) -- 输出 "1 1"
count = 0
for _ in pairs(tbl) do count = count + 1 end
print(count) -- 输出 "2"
如何获取所有条目的数量而不进行计算?
原文链接 https://stackoverflow.com/questions/2705793
你可以设置一个元表来跟踪条目的数量,如果需要频繁访问这些信息,那么这可能比迭代更快。
有一种方法,但可能会令人失望:使用额外变量(或表中的一个字段)来存储计数,并在每次插入时增加它。
count = 0
tbl = {}
tbl["test"] = 47
count = count + 1
tbl[1] = 48
count = count + 1
print(count) -- 打印 "2"
没有其他方法,# 运算符只能用于具有连续键的类似数组的表。
--定义一个函数 CountedTable,它的参数 x 是一个表
local function CountedTable(x)
--确保 x 是一个表
assert(type(x) == 'table', 'bad parameter #1: must be table')
--新建一个表 new_t,作为 CountedTable 的返回值
local new_t = {}
--新建一个元表 mt,用来重载 new_t 的某些操作
local mt = {}
--all 用来保存表 x 的元素数量(包括 key 和 value)
local all = 0
for k, v in pairs(x) do
all = all + 1
end
--重载new_t中某个元素的赋值操作
mt.__newindex = function(t, k, v)
--如果 v 是 nil,说明需要删除这个元素
if v == nil then
--如果表 x 中确实有这个元素,那么 all 减 1
if rawget(x, k) ~= nil then
all = all - 1
end
else
--如果表 x 中没有这个元素,那么 all 加 1
if rawget(x, k) == nil then
all = all + 1
end
end
--在表 x 中添加或更新元素
rawset(x, k, v)
end
--重载new_t中某个元素的访问操作
mt.__index = function(t, k)
--如果访问的是 'totalCount',则返回表 x 的所有元素数量
if k == 'totalCount' then return all
--否则,返回表 x 中的相应元素
else return rawget(x, k) end
end
--将元表 mt 应用到表 new_t 上
return setmetatable(new_t, mt)
end
--使用 CountedTable 函数创建一个新的表 bar
local bar = CountedTable { x = 23, y = 43, z = 334, [true] = true }
--测试表 bar 中的元素数量
assert(bar.totalCount == 4)
--测试表 bar 的元素
assert(bar.x == 23)
--删除表 bar 中的元素 x
bar.x = nil
--测试表 bar 的元素数量
assert(bar.totalCount == 3)
--再次删除表 bar 中的元素 x
bar.x = nil
--测试表 bar 的元素数量
assert(bar.totalCount == 3)
--向表 bar 中添加一个新的元素 x,并将其赋值为 24,再赋值为 25
bar.x = 24
bar.x = 25
--测试表 bar 的元素 x 和元素数量
assert(bar.x == 25)
assert(bar.totalCount == 4)
似乎当使用 insert 方法添加表格元素时,getn 会正确返回,否则我们需要计算所有元素。
mytable = {}
element1 = {version = 1.1}
element2 = {version = 1.2}
table.insert(mytable, element1)
table.insert(mytable, element2)
print(table.getn(mytable))
它会正确地打印出 2。
我知道的获取表中条目数量的最简单方法就是使用'#'。只要它们被编号,#tableName 就可以获取到条目数量:
tbl={
[1]
[2]
[3]
[4]
[5]
}
print(#tbl)--打印表中最高的数字: 5
很遗憾,如果它们没有编号,就不能使用此方法。
你可以使用 penlight 库。它具有一个 size
函数,可以给出表的实际大小。
它实现了许多我们在编程中需要但在 Lua 中缺少的功能。
以下是使用它的示例。
> tablex = require "pl.tablex"
> a = {}
> a[2] = 2
> a[3] = 3
> a['blah'] = 24
> #a
0
> tablex.size(a)
3
我偶然发现这个线程,并想发布另一种选择。我使用从块控制器生成的 Luad,但它的实质是通过检查表中的值,然后将正在检查的值递增1来工作。最终,表将用尽,该索引处的值将为 Nil。
因此,从返回 nil 的索引中减去 1,即为表的大小。
我有一个全局变量 TableSize,它被设置为此计数的结果。
function Check_Table_Size()
local Count = 1
local CurrentVal = (CueNames[tonumber(Count)])
local repeating = true
print(Count)
while repeating == true do
if CurrentVal ~= nil then
Count = Count + 1
CurrentVal = CueNames[tonumber(Count)]
else
repeating = false
TableSize = Count - 1
end
end
print(TableSize)
end
# 获取表格长度的函数
function GetTableLng(tbl) local getN = 0 for n in pairs(tbl) do getN = getN + 1 end return getN end
``` 你是对的。获取表格长度的其他方法是不存在的。
- 如何在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中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
你已经在问题中找到了解决方案--唯一的方法是用
pairs(..)
迭代整个表格。function tablelength(T) local count = 0 for _ in pairs(T) do count = count + 1 end return count end
此外,请注意,
#
操作符的定义比这更复杂。让我通过采取这个表来说明:根据手册,
#t
的结果可以是 3、5 和 9 中的 任何一个。唯一明智的方法是使用没有空值的单个连续部分的数组。