0

したがって、次のような他のテーブルへの参照を保持するテーブルがあります。

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個のオブジェクト全体で反復処理されるのを待つ必要があります。この設定により、プログラムがクロールされます。文字列ではない、またはワンライナーであるテーブルとテーブルの比較ではない、ある種のキーを作成する方法はありますか?好き:

if a.collection[{z}] then return true end

前もって感謝します!

4

3 に答える 3

3

オブジェクトをテーブルのキー スロットではなく値スロットに格納するのはなぜですか?

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
于 2012-02-21T16:37:01.503 に答える
1

それが速いかどうかはわかりませんが、おそらくこれは役に立ちます:

充填:

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

それが目的ではない場合は、配列全体を小さなバケットに分割し、ハッシュを使用して、どのオブジェクトがどのバケットに属しているかを追跡できます。

于 2012-02-21T03:13:31.877 に答える
0

Pairs() の使用から通常の for ループの使用に切り替えて、テーブルのインデックスを作成することを検討することをお勧めします。

for i=1, #a.collection do
    if a.collection[i] == z then
        return true
    end
end

私は、pairs() とテーブルのインデックス作成の両方を使用して、100 万のテーブルのコレクションを反復処理する速度を比較しました。インデックス作成は毎回少し速くなりました。os.clock() を使用してコードをプロファイリングしてみてください。

ある種のハッシュ関数を使用して a.collection テーブルに一意のインデックスを設定する以外に、ソリューションのより高速な方法は本当に考えられません。ただし、これを行うと、特定のテーブルを取得することが重要なタスクになります (.collection[99] を実行できるだけでなく、必要なテーブルが見つかるまで反復する必要があります。 a.collection[hashFunc(z)] ~= nil...) のようなことを行うことで、テーブルが a.collection にあるかどうかを簡単にテストできます。

于 2012-02-21T04:14:15.760 に答える