如何获取 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

点赞
stackoverflow用户137317
stackoverflow用户137317

你已经在问题中找到了解决方案--唯一的方法是用 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

根据手册,#t 的结果可以是 3、5 和 9 中的 任何一个。唯一明智的方法是使用没有空值的单个连续部分的数组。

2010-04-24 19:14:11
stackoverflow用户240633
stackoverflow用户240633

你可以设置一个元表来跟踪条目的数量,如果需要频繁访问这些信息,那么这可能比迭代更快。

2010-04-24 19:36:21
stackoverflow用户312586
stackoverflow用户312586

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

count = 0
tbl = {}

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

tbl[1] = 48
count = count + 1

print(count)   -- 打印 "2"

没有其他方法,# 运算符只能用于具有连续键的类似数组的表。

2010-04-25 14:13:10
stackoverflow用户4273586
stackoverflow用户4273586
--定义一个函数 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)
2016-05-09 11:24:33
stackoverflow用户5120986
stackoverflow用户5120986

似乎当使用 insert 方法添加表格元素时,getn 会正确返回,否则我们需要计算所有元素。

mytable = {}
element1 = {version = 1.1}
element2 = {version = 1.2}
table.insert(mytable, element1)
table.insert(mytable, element2)
print(table.getn(mytable))

它会正确地打印出 2。

2017-10-25 06:04:07
stackoverflow用户6178520
stackoverflow用户6178520

我知道的获取表中条目数量的最简单方法就是使用'#'。只要它们被编号,#tableName 就可以获取到条目数量:

tbl={
    [1]
    [2]
    [3]
    [4]
    [5]
}
print(#tbl)--打印表中最高的数字: 5

很遗憾,如果它们没有编号,就不能使用此方法。

2017-11-02 11:53:15
stackoverflow用户88888888
stackoverflow用户88888888

你可以使用 penlight 库。它具有一个 size 函数,可以给出表的实际大小。

它实现了许多我们在编程中需要但在 Lua 中缺少的功能。

以下是使用它的示例。

> tablex = require "pl.tablex"
> a = {}
> a[2] = 2
> a[3] = 3
> a['blah'] = 24

> #a
0

> tablex.size(a)
3
2019-07-01 12:21:40
stackoverflow用户14311514
stackoverflow用户14311514

我偶然发现这个线程,并想发布另一种选择。我使用从块控制器生成的 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
2020-09-20 21:57:28
stackoverflow用户14583597
stackoverflow用户14583597
# 获取表格长度的函数

function GetTableLng(tbl) local getN = 0 for n in pairs(tbl) do getN = getN + 1 end return getN end

``` 你是对的。获取表格长度的其他方法是不存在的。

2020-11-17 19:28:42