Wie kann ich die Anzahl der Schlüssel in einer Hash-Tabelle in Lua bekommen?
Frage
myTable = {}
myTable["foo"] = 12
myTable["bar"] = "blah"
print(#myTable) -- this prints 0
Muss ich tatsächlich durch die Elemente in der Tabelle durchlaufen die Anzahl der Schlüssel zu bekommen?
numItems = 0
for k,v in pairs(myTable) do
numItems = numItems + 1
end
print(numItems) -- this prints 2
Lösung
Ich experimentierte sowohl mit dem # Operator und table.getn (). Ich dachte table.getn () würde das tun, was Sie wollten, aber es stellt sich heraus es den gleichen Wert wie # Rückkehr, nämlich 0. Es scheint, dass Wörterbücher nil Platzhalter wie nötig einzusetzen.
die Tasten Looping über und Zählen sie scheint wie die einzige Möglichkeit, die Größe des Wörterbuchs zu erhalten.
Andere Tipps
Die Länge einer Tabelle T ist definiert als jeder ganzzahlige Index n sein, so dass t [n] nicht gleich Null und t [n + 1] ist gleich Null; Außerdem, wenn t [1] gleich null ist, n null sein kann. Für eine regelmäßige Anordnung mit Nicht-Null-Wert von 1 bis n einem gegebenen, ist seine Länge genau, dass n der Index des letzten Wertes. Wenn das Array „Löcher“ aufweist (das heißt, Null-Werte zwischen anderen Nicht-Null-Werte), dann kann #t einem der Indizes, die direkt einen Nullwert vorausgeht (das heißt, es kann eine solche Nullwert als das Ende betrachten des Arrays).
so einziger Weg Länge zu erhalten ist, durchläuft sie.
Neben Iterieren über die Tasten manuell, ist es einfach automatisch über metamethods Überblick zu behalten. Erwägen Sie wollen wahrscheinlich nicht den Überblick über jedem Tisch zu halten, die Sie machen, können Sie nur eine Funktion schreiben, dass Sie jede Tabelle in eine Schlüssel zählbaren Objekt konvertieren können. Im Folgenden ist nicht perfekt, aber ich denke, es würde den Punkt illustrieren:
function CountedTable(x)
assert(type(x) == 'table', 'bad parameter #1: must be table')
local mt = {}
-- `keys` will represent the number of non integral indexes
-- `indxs` will represent the number of integral indexes
-- `all` will represent the number of both
local keys, indxs, all = 0, 0, 0
-- Do an initial count of current assets in table.
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
-- By using `__nexindex`, any time a new key is added, it will automatically be
-- tracked.
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
-- This allows us to have fields to access these datacounts, but won't count as
-- actual keys or indexes.
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
Beispiele hierfür verwendet würden gehören:
-- Note `36.35433` would NOT be counted as an integral index.
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
Hope this geholfen! :)
Lua speichert Tabelle als zwei trennt Teile: einen Hash-Teil und ein Array-Teil, nur die len Operator mit dem Array-Teil beschäftigen, Wert durch einen Zahlenwert indiziert bedeutet, zuzüglich hier genannten Regeln verwenden, so dass Sie haben keine Wahl zum Zählen "Hash" -Wert müssen Sie mit Paare () Funktion.
über den Tisch iterieren