質問
だから私は次のような他のテーブルへの参照を保持するテーブルを持っています:
local a = newObject()
a.collection = {}
for i = 1, 100 do
local b = newObject()
a[#a + 1] = b
end
特定のオブジェクトが「a」内にあるかどうかを確認したい場合は、次のようなペアを使用する必要があります。
local z = a.collection[ 99 ]
for i,j in pairs( a.collection ) do
if j == z then
return true
end
end
Zオブジェクトは99番目の場所にあり、他の98オブジェクト全体でペアが繰り返されるのを待たなければなりません。このセットアップは私のプログラムをクロールさせます。 1つのライナーである文字列やテーブルとテーブルの比較ではなく、何らかのキーを作成する方法はありますか?お気に入り:
if a.collection[{z}] then return true end
前もって感謝します!
解決
テーブルのキースロットではなく、値スロットにオブジェクトを保存するのはなぜですか?
local a = newObject()
a.collection = {}
for i = 1, 100 do
local b = newObject()
a.collection[b] = i
end
特定のオブジェクトが「a」内にあるかどうかを確認するために
return a.collection[b]
コレクションへの整数インデックスアクセスが必要な場合は、両方の方法で保存します。
local a = newObject()
a.collection = {}
for i = 1, 100 do
local b = newObject()
a.collection[i] = b
a.collection[b] = i
end
発見:
local z = a.collection[99]
if a.collection[z] then return true end
他のヒント
速いかどうかはわかりませんが、これは役立ちます。
充填:
local a = {}
a.collection = {}
for i = 1, 100 do
local b = {}
a.collection[b] = true -- Table / Object as index
end
発見:
local z = a.collection[99]
if a.collection[z] then return true end
それがあなたがやりたいことではない場合、あなたはあなたのアレイ全体をより小さなバケツに分割し、ハッシュを使用してどのオブジェクトがどのバケットに属しているかを追跡することができます。
ペア()の使用からループに通常のものを使用し、テーブルのインデックス作成に切り替えることを検討することをお勧めします。ペア()は、テーブルのより大きなコレクションで遅くなるようです。
for i=1, #a.collection do
if a.collection[i] == z then
return true
end
end
ペア()とテーブルインデックスの両方を使用して100万台のテーブルのコレクションを介して反復速度を比較しましたが、インデックス作成は毎回少し速くなりました。 os.clock()を使用して自分で試してみてください。
ある種のハッシュ関数を使用してA.Collectionテーブルに一意のインデックスを設定する以外に、あなたのソリューションのより速い方法を本当に考えることはできません。ただし、これを行うと、特定のテーブルが取得されない場合は、A.Collection [99]を実行できるだけでなく、必要なものを見つけるまで繰り返す必要があります。 a.collection [hashfunc(z)]〜= nil ...)のようなことを行うことで、テーブルがa.collectionにあるかどうかを簡単にテストできます。