所以我有一个表,其中包含对其他表的引用,如:
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
提前致谢!
答案 0 :(得分: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
答案 1 :(得分: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
如果这不是您想要做的,您可以将整个阵列分解为更小的桶并使用哈希来跟踪哪个对象属于哪个桶。
答案 2 :(得分:0)
您可能要考虑从使用pairs()切换到使用常规for循环并对表进行索引,对于较大的表集合,pairs()似乎较慢。
for i=1, #a.collection do
if a.collection[i] == z then
return true
end
end
我使用两个对()和表索引来比较迭代100万个表的集合的速度,并且索引每次都快一点。使用os.clock()自行尝试来分析你的代码。
除了使用某种散列函数将唯一索引设置到a.collection表中之外,我无法真正想到更快的解决方案。然而,这样做会使特定的表格成为一个非常重要的任务(你不能只做一个.collection [99],你必须迭代直到找到你想要的那个。但是你通过像a.collection [hashFunc(z)]〜= nil这样的东西,可以很容易地测试表是否在a.collection中。)