3

テーブル エントリ インデックスを取得できません。テーブルからアイテムを削除する必要があります。

table.insertテーブルにエントリを追加するために使用します。

もう 1 つの質問: なぜ Lua には table.remove 関数への「オーバーロード」がなく、連想インデックスで項目を削除できるのでしょうか?

4

2 に答える 2

7

テーブルは、キーと値の間の順序付けされていない 1 対多の関係を実装します。つまり、特定のキー (インデックス) はテーブルに 1 回しか出現できませんが、値は複数回出現する可能性があります。

key がわかっている場合は、キーkt[k] = nil関連する値の両方をテーブルから削除します。ただし、この操作は、テーブル内の他のキーまたは値には影響しません。

table.insertおよび関数はtable.remove、配列またはリストを実装するために規則で使用される、1 から始まる一連の連続した整数キーに対して動作します。そのために、リストに穴が生じないように、リスト内の他の値を操作します。

値が見つかったキーを見つける 1 つの方法は、単純にテーブルを検索することです。これが複数回行われる場合は、値によるルックアップがインデックスによるルックアップと同じくらい高速になるように、キーと値のペアを反転する 2 つ目のテーブルを作成することをお勧めします。

適切な実装は、想定とニーズによって異なります。いくつかのサンプルは次のとおりです。

-- return the first integer index holding the value 
function AnIndexOf(t,val)
    for k,v in ipairs(t) do 
        if v == val then return k end
    end
end

-- return any key holding the value 
function AKeyOf(t,val)
    for k,v in pairs(t) do 
        if v == val then return k end
    end
end

-- return all keys holding the value
function AllKeysOf(t,val)
    local s={}
    for k,v in pairs(t) do 
        if v == val then s[#s+1] = k end
    end
    return s
end

-- invert a table so that each value is the key holding one key to that value 
-- in the original table.
function Invert(t)
    local i={}
    for k,v in pairs(t) do 
        i[v] = k
    end
    return i
end
于 2010-01-19T23:31:56.480 に答える
1

t[k]=niltキーでエントリから削除しますk

2 番目の質問に対する答えは、テーブルが個別のメタテーブルを持つことができるということです。

于 2010-01-19T19:59:12.200 に答える