如何获取 Lua 表中的条目数?

听起来像是“让我帮你谷歌一下”的问题,但不知为何我找不到答案。Lua #操作符只使用整数键计数条目,table.getn也是如此:

tbl = {}
tbl["test"] = 47
tbl[1] = 48
print(#tbl, table.getn(tbl))   -- prints "1     1"


count = 0
for _ in pairs(tbl) do count = count + 1 end
print(count)            -- prints "2"

如何得到不计数的 所有条目的数量?

310983 次浏览

您已经有了问题中的解决方案——唯一的方法是使用 pairs(..)迭代整个表。

function tablelength(T)
local count = 0
for _ in pairs(T) do count = count + 1 end
return count
end

另外,请注意“ #”运算符的定义比这个稍微复杂一些。让我以这张表格来说明这一点:

t = {1,2,3}
t[5] = 1
t[9] = 1

根据手册,任何3,5和9是 #t的有效结果。使用它的唯一合理方法是使用一个连续部分的数组,而不使用 nil 值。

您可以设置一个元表来跟踪条目的数量,如果这些信息是经常需要的,那么这可能比迭代更快。

有一种方法,但可能会令人失望: 使用一个额外的变量(或表的一个字段)来存储计数,并在每次插入时增加计数。

count = 0
tbl = {}


tbl["test"] = 47
count = count + 1


tbl[1] = 48
count = count + 1


print(count)   -- prints "2"

没有其他方法,# 操作符只能在具有连续键的类似数组的表上工作。

local function CountedTable(x)
assert(type(x) == 'table', 'bad parameter #1: must be table')


local new_t = {}
local mt = {}


-- `all` will represent the number of both
local all = 0
for k, v in pairs(x) do
all = all + 1
end


mt.__newindex = function(t, k, v)
if v == nil then
if rawget(x, k) ~= nil then
all = all - 1
end
else
if rawget(x, k) == nil then
all = all + 1
end
end


rawset(x, k, v)
end


mt.__index = function(t, k)
if k == 'totalCount' then return all
else return rawget(x, k) end
end


return setmetatable(new_t, mt)
end


local bar = CountedTable { x = 23, y = 43, z = 334, [true] = true }


assert(bar.totalCount == 4)
assert(bar.x == 23)
bar.x = nil
assert(bar.totalCount == 3)
bar.x = nil
assert(bar.totalCount == 3)
bar.x = 24
bar.x = 25
assert(bar.x == 25)
assert(bar.totalCount == 4)

似乎当通过插入方法添加表的元素时,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)--prints the highest number in the table: 5

可悲的是,如果他们没有编号,就不会成功。

你可以使用 笔形图书馆。它有一个函数 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

你说得对,没有其他方法可以得到桌子的长度