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

Rom*_*kov 120 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"
Run Code Online (Sandbox Code Playgroud)

如何在不计算所有条目的情况下获取所有条目的数量?

u0b*_*6ae 118

您已经在问题中找到了解决方案 - 唯一的方法是迭代整个表pairs(..).

function tablelength(T)
  local count = 0
  for _ in pairs(T) do count = count + 1 end
  return count
end
Run Code Online (Sandbox Code Playgroud)

另外,请注意"#"运算符的定义比这更复杂.让我通过这个表来说明:

t = {1,2,3}
t[5] = 1
t[9] = 1
Run Code Online (Sandbox Code Playgroud)

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

  • 当我第一次意识到像`#`这样的基本运算符的返回值不确定时,我仍然对Lua的经历感到不寒而栗. (38认同)
  • `根据手册,3,5和9中的任何一个都是#t`的有效结果.根据手册,在非序列上调用#是*[undefined](http://www.lua.org/manual/5.2/manual.html#3.4.6)*.这意味着*any*result(-1,3,3.14,5,9)有效. (17认同)
  • 哦,这可能是确定性的.这与C标准留下实现定义行为的东西完全相同.这样的原因是不同的实现者可以选择不同的实现选择. (5认同)
  • 事实上,非序列上的#不会产生异常只是使用lua有点像削减自己感觉更好的事情之一. (5认同)
  • 关于有效结果:u0b34a0f6ae对于Lua 5.1是正确的,而cubuspl42对于Lua 5.2是正确的.在任何一种情况下,整个事情都是完全疯狂的. (4认同)

erg*_*sys 19

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

  • 您应该将数据存储在单独的表中(例如,可以作为 __index 和 __newindex 的 upvalue 进行访问)。然后 __index 和 __newindex 都会在每次表访问时触发。不过,您应该检查性能是否可以接受。 (2认同)

Sur*_*e12 14

据我所知,获取表中条目数的最简单方法是使用“#”。#tableName 只要有编号就可以获取条目的数量:

tbl={
    [1]
    [2]
    [3]
    [4]
    [5]
}
print(#tbl)--prints the highest number in the table: 5
Run Code Online (Sandbox Code Playgroud)

不幸的是,如果它们没有编号,它就不起作用。


스피겔*_*겔 빈 6

function GetTableLng(tbl)
  local getN = 0
  for n in pairs(tbl) do 
    getN = getN + 1 
  end
  return getN
end
Run Code Online (Sandbox Code Playgroud)

你说得对。没有其他方法可以获取表的长度


kik*_*ito 5

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

count = 0
tbl = {}

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

tbl[1] = 48
count = count + 1

print(count)   -- prints "2"
Run Code Online (Sandbox Code Playgroud)

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

  • 这可以通过代理表和元方法实现自动化,如 [ergosys 的回答](http://stackoverflow.com/questions/2705793/how-to-get-number-of-entries-in-a-lua-table /2705855#2705855) (4认同)