2009-03-17 5 views

Antwort

19

Ich experimentierte mit dem Operator # und table.getn(). Ich dachte table.getn() würde tun, was Sie wollten, aber wie sich herausstellt, dass es den gleichen Wert wie #, nämlich 0 zurückgibt. Es scheint, dass Wörterbücher nil Platzhalter wie notwendig einfügen.

Schleifen über die Tasten und zählen sie scheint der einzige Weg, um die Wörterbuchgröße zu bekommen.

+0

print (table.getn (myTable)) Dieser druckt 0 – Jay

+3

# Abkürzung für table.getn ist, so dass Sie gleichen Ergebnisse –

+0

Um zu klären, erhalten wird, kehrt #tbl die Länge der Tabelle TBL –

6

Die Länge einer Tabelle t ist definiert als ein ganzzahliger Index n, so dass t [n] nicht Null ist und t [n + 1] Null ist; Wenn t [1] gleich Null ist, kann n außerdem Null sein. Für ein normales Array mit Nicht-Null-Werten von 1 bis zu einem gegebenen n ist seine Länge genau das n, der Index seines letzten Wertes. Wenn das Array "Löcher" aufweist (dh keine Werte zwischen anderen Nicht-Null-Werten), kann #t jeder der Indizes sein, die direkt einem Nullwert vorangestellt sind (d. H., Es kann einen beliebigen Nullwert als Ende betrachten des Arrays). Also, nur um die Länge zu bekommen, iteriere ich darüber.

1

Lua speichert Tabelle als zwei getrennte Teile: ein Hash-Teil und ein Array-Teil, der len-Operator behandelt nur den Array-Teil, dh Wert durch einen Zahlenwert indiziert, zuzüglich der unten genannten Regeln, so dass Sie nicht haben jede Wahl zum Zählen von "Hash" -Wert müssen Sie über die Tabelle mit Paare() Funktion durchlaufen.

4

Abgesehen von der manuellen Iteration der Schlüssel ist es einfach, sie automatisch über Metame- thoden zu verfolgen. Wenn man bedenkt, dass Sie wahrscheinlich nicht jede von Ihnen erstellte Tabelle im Auge behalten wollen, können Sie einfach eine Funktion schreiben, mit der Sie jede Tabelle in ein zählbares Objekt umwandeln können. Im Folgenden ist nicht perfekt, aber ich denke, es ist der Punkt illustrieren würde:

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 dafü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 Working Example

Hope this geholfen! :)

+0

Sie können die Entfernung von Schlüsseln nicht verfolgen. – Timothy003