如何在Lua中获取哈希表中键的数量?

myTable = {}
myTable["foo"] = 12
myTable["bar"] = "blah"
print(#myTable) -- 这将打印 0

我真的必须遍历表中的项目才能获取键的数量吗?

numItems = 0
for k,v in pairs(myTable) do
    numItems = numItems + 1
end
print(numItems) -- 这将打印 2

原文链接 https://stackoverflow.com/questions/652957

点赞
stackoverflow用户48940
stackoverflow用户48940

我尝试了 # 运算符和 table.getn()。我以为 table.getn() 可以实现你想要的,但事实证明它返回的值与 # 相同,即 0。看起来字典会根据需要插入 nil 占位符。

循环遍历键并计算它们似乎是获取字典大小的唯一方法。

2009-03-17 04:01:11
stackoverflow用户75076
stackoverflow用户75076

Lua 中的长度运算符:

表 t 的长度被定义为任意一个整数索引 n ,满足 t[n] 不是 nil 且 t[n+1] 是 nil;此外,如果 t[1] 是 nil ,那么 n 可以为零。对于一个普通的数组,其非空值从 1 到某个 n,那么它的长度恰好是那个 n,也就是它的最后一个值的索引。如果数组中有“空洞”(也就是在其它非空值之间的 nil 值),那么 #t 可以是直接在一个 nil 值之前的任意索引(也就是它可能将任何此类 nil 值视为数组的结束)。

因此,获取长度的唯一方法是对其进行迭代。

2009-03-17 04:07:54
stackoverflow用户1211342
stackoverflow用户1211342

Lua 将表分为两个不同的部分:哈希部分和数组部分。 len 操作符仅处理数组部分,这意味着只处理数字索引的值,此外,还遵循下面提到的规则。因此,如果要计算“哈希”值,你只能使用 pairs() 函数来迭代整个表。

2012-02-16 20:53:03
stackoverflow用户195701
stackoverflow用户195701

除了手动遍历键之外,通过元方法自动跟踪它很简单。考虑到您可能不想跟踪每个表,您可以编写一个函数,使您能够将任何表格转换为可计数的键的对象。以下不完美,但我认为它会说明问题:

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

  local mt = {}
  - - `keys`将表示非整数索引的数量
  - - `indxs`将表示整数索引的数量
  - - `all`将代表两者的数量
  local keys, indxs, all = 0, 0, 0

  - - 对表格中当前资产进行初始计数。
  for k, v in pairs(x) do
    if (type(k) == 'number') and (k == math.floor(k)) then indxs = indxs + 1
    else keys = keys + 1 end

    all = all + 1
  end

  - - 通过使用“__nexindex”,每当添加新键时,它就会自动跟踪它。
  mt.__newindex = function(t, k, v)
    if (type(k) == 'number') and (k == math.floor(k)) then indxs = indxs + 1
    else keys = keys + 1 end

    all = all + 1
    t[k] = v
  end

  - - 这使我们可以有字段来访问这些数据计数,但不会计为实际键或指数。
  mt.__index = function(t, k)
    if k == 'keyCount' then return keys
    elseif k == 'indexCount' then return indxs
    elseif k == 'totalCount' then return all end
  end

  return setmetatable(x, mt)
end

使用示例包括:

--请注意,“36.35433”将不会被计为整数索引。
local foo = CountedTable { 1, 2, 3, 4, [36.35433] = 36.35433, [54] = 54 }
local bar = CountedTable { x = 23, y = 43, z = 334, [true] = true }
local foobar = CountedTable { 1, 2, 3, x = 'x', [true] = true, [64] = 64 }

print(foo.indexCount)    --> 5
print(bar.keyCount)      --> 4
print(foobar.totalCount) --> 6

Live Working Example

希望这能有所帮助! :)

2013-11-03 18:35:18