Как получить количество записей в таблице 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"
как мне получить число все записи без счета?
6 ответов:
у вас уже есть решение в вопросе - единственный способ-повторить всю таблицу с
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
. Единственный разумный способ использовать его-с массивами одной смежной части без нулевых значений.
вы можете настроить мета-таблицу для отслеживания количества записей, это может быть быстрее, чем итерация, если эта информация необходима часто.
есть один способ, но он может быть разочаровывающим: используйте дополнительную переменную (или одно из полей таблицы) для хранения количества и увеличивайте ее каждый раз, когда вы делаете вставку.
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)
самый простой способ, который я знаю, чтобы получить количество записей в таблице с '#'. #tableName получает количество записей, если они пронумерованы:
tbl={ [1] [2] [3] [4] [5] } print(#tbl)--prints the highest number in the table: 5
к сожалению, если они не пронумерованы, это не сработает.
Кажется, когда элементы таблицы добавляются методом insert, getn вернется правильно. В противном случае, мы должны считать все элементы
mytable = {} element1 = {version = 1.1} element2 = {version = 1.2} table.insert(mytable, element1) table.insert(mytable, element2) print(table.getn(mytable))
Он будет печатать 2 Правильно