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 循环并对表进行索引,pairs() 在较大的表集合上似乎较慢。

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

我比较了使用pairs() 和表索引对100 万个表的集合进行迭代的速度,每次索引都快一点。自己尝试使用 os.clock() 来分析您的代码。

除了使用某种散列函数将唯一索引设置到 a.collection 表中之外,我真的想不出更快的解决方案。但是,这样做会使获取特定表成为一项不平凡的任务(您不仅可以执行 a.collection[99],还必须遍历直到找到所需的表。但是然后您可以通过执行类似 a.collection[hashFunc(z)] ~= nil...) 轻松测试表是否在 a.collection 中

于 2012-02-21T04:14:15.760 回答