これが古い投稿であることは知っていますが、後世のために何かを追加したかったのです。あなたが抱えている問題を処理する簡単な方法は、値からキーへの別のテーブルを作成することです。
すなわち。同じ値を持つ 2 つのテーブルがあり、1 つは一方向を指し、もう 1 つは別の方向を指しています。
function addValue(key, value)
if (value == nil) then
removeKey(key)
return
end
_primaryTable[key] = value
_secodaryTable[value] = key
end
function removeKey(key)
local value = _primaryTable[key]
if (value == nil) then
return
end
_primaryTable[key] = nil
_secondaryTable[value] = nil
end
function getValue(key)
return _primaryTable[key]
end
function containsValue(value)
return _secondaryTable[value] ~= nil
end
次に、新しいテーブルにクエリを実行して、キー「要素」があるかどうかを確認できます。これにより、他のテーブルのすべての値を反復処理する必要がなくなります。
たとえば文字列ではないために「要素」を実際にキーとして使用できないことが判明した場合は、たとえばチェックサムを追加するかtostring
、それをキーとして使用します。
なぜこれをしたいのですか?テーブルが非常に大きい場合、すべての要素を反復処理する時間が非常に長くなるため、頻繁に反復処理を行うことができなくなります。同じオブジェクトの 2 つのコピーではなく、同じオブジェクトへの 2 つのポインターを格納するため、追加のメモリ オーバーヘッドは比較的小さくなります。テーブルが非常に小さい場合は、それほど重要ではありません。実際には、別のマップ ルックアップを行うよりも反復する方が速い場合もあります。
ただし、質問の文言は、対処するアイテムが多数あることを強く示唆しています。