Wie kann ich die Anzahl der Schlüssel in einer Hash-Tabelle in Lua bekommen?

StackOverflow https://stackoverflow.com/questions/652957

  •  19-08-2019
  •  | 
  •  

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
War es hilfreich?

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 Operator:

  

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

Live Arbeitsbeispiel

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top