Как получить количество записей в таблице Lua?
Похоже на вопрос "дайте мне google это для вас", но почему-то я не могу найти ответ. Оператор 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"
Как получить количество всех записей без их подсчета?
Ответы
Ответ 1
У вас уже есть решение в вопросе - единственный способ - перебрать всю таблицу с помощью 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.
Ответ 2
Вы можете настроить мета-таблицу для отслеживания количества записей, это может быть быстрее, чем итерация, если эта информация необходима часто.
Ответ 3
Там один путь, но это может быть неутешительно: используйте дополнительную переменную (или одно из поля таблицы) для хранения счета и увеличивайте ее каждый раз, когда вы вставляете.
count = 0
tbl = {}
tbl["test"] = 47
count = count + 1
tbl[1] = 48
count = count + 1
print(count) -- prints "2"
Нет другого способа, оператор # будет работать только с таблицами с массивом с последовательными ключами.
Ответ 4
Самый простой способ узнать количество записей в таблице - "#". #tableName получает количество записей, если они пронумерованы:
tbl={
[1]
[2]
[3]
[4]
[5]
}
print(#tbl)--prints the highest number in the table: 5
К сожалению, если они не пронумерованы, это не сработает.
Ответ 5
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)
Ответ 6
возникает, когда элементы таблицы добавляются методом insert, getn вернется правильно. В противном случае мы должны считать все элементы
mytable = {}
element1 = {version = 1.1}
element2 = {version = 1.2}
table.insert(mytable, element1)
table.insert(mytable, element2)
print(table.getn(mytable))
Он правильно напечатает 2
Ответ 7
Вы можете использовать библиотеку Penlight. Это имеет size
функции, который дает фактический размер таблицы.
В нем реализованы многие функции, которые могут нам понадобиться при программировании и отсутствовать в Lua.
Вот пример для его использования.
> tablex = require "pl.tablex"
> a = {}
> a[2] = 2
> a[3] = 3
> a['blah'] = 24
> #a
0
> tablex.size(a)
3