質問

だから私は次のような他のテーブルへの参照を保持するテーブルを持っています:

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にあるかどうかを簡単にテストできます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top