的Lua表比较中的表

问题描述:

所以我必须保持像其它表引用的表:如果我想看到的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

在此先感谢!

你为什么要存储的值插槽对象,而不是键槽桌子?

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

不知道它的速度更快或没有,但也许这会有所帮助:

灌装:

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

您可能需要考虑从使用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)〜=零...)