質問
私は、テーブルエントリのインデックスを取得することはできません。私はそれがテーブルから項目を削除する必要があります。
私は、テーブルにエントリを追加するtable.insert
を使用します。
もう一つの質問:?1が連想インデックスでアイテムを削除することができますので、Luaが関数table.removeに「過負荷」を持っていない理由
解決
t[k]=nil
削除しt
からキーk
のエントリます。
2番目の質問については、答えはテーブルは、個々のメタテーブルを持つことができるということです。
他のヒント
表は、キーと値の間の多くの関係に順序付けられていないものを実装します。換言すれば、任意の特定のキー(インデックス)は、一度だけテーブルに表示することができ、その値は、複数回出現することができます。
あなたがキーk
を知っている場合は、、そしてt[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