2012-02-21 40 views
0

所以我必須保持像其它表引用的表:如果我想看到的Lua表比較中的表

local a = newObject() 
a.collection = {} 
for i = 1, 100 do 
    local b = newObject() 
    a[#a + 1] = b 
end 

現在,如果一個特定的對象中「一」我必須使用對像這樣:

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

在此先感謝!

回答

3

你爲什麼要存儲的值插槽對象,而不是鍵槽桌子?

local a = newObject() 
a.collection = {} 
for i = 1, 100 do 
    local b = newObject() 
    a.collection[b] = i 
end 

,看是否有特定的對象中 「一」

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 
+0

謝謝!這個解決方案很完美。 – Theopile 2012-02-21 20:41:45

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 

如果這不是你想要做你什麼可以將整個數組分成較小的桶並使用散列來跟蹤哪個對象屬於哪個桶。

+0

這對我來說不適用於某些reaso ñ,我不回答真實。 – Theopile 2012-02-21 04:20:32

+0

http://lua-users.org/wiki/TablesTutorial 部分「鍵是引用」,請務必對錶使用相同的引用,而不是重新創建相同的第二個表。 – ccKep 2012-02-21 04:51:14

0

您可能需要考慮從使用pairs()切換到使用常規for循環和索引表,pairs()似乎對較大的表集合較慢。

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

我通過比較使用兩對()百萬的表和表的索引集合迭代的速度,和索引是快一點點,每次。使用os.clock()自己嘗試來剖析你的代碼。

除了使用某種散列函數將唯一索引設置到a.collection表中之外,我無法真正想到更快的解決方案。然而,這樣做會讓一個特定的表格變成一個非平凡的任務(你不會只能夠做一個.collection [99],你必須遍歷,直到找到你想要的東西。可以很容易地測試,如果表是a.collection通過執行類似a.collection [hashFunc(Z)〜=零...)