的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
答
不知道它的速度更快或没有,但也许这会有所帮助:
灌装:
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
如果这不是你想要做你什么可以将整个数组分成较小的桶并使用散列来跟踪哪个对象属于哪个桶。
答
您可能需要考虑从使用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)〜=零...)
谢谢!这个解决方案很完美。 – Theopile 2012-02-21 20:41:45