Lua表格中的比较表格

我有一张表,保存了对其他表的引用,如下所示:

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

现在,如果我想查看特定对象是否在“a”中,我必须使用 pairs,就像这样:

local z = a.collection[ 99 ]
for i,j in pairs( a.collection ) do
    if j == z then
    return true
  end
end

z对象在第99个位置,我必须等待pairs迭代其他98个对象。这种设置使我的程序变得缓慢。有没有办法制作一些不是字符串或表格比较的键,以便一行代码就能完成任务?像:

if a.collection[{z}] then return true end

提前致谢!

原文链接 https://stackoverflow.com/questions/9371557

点赞
stackoverflow用户1179287
stackoverflow用户1179287

不知道是否更快,但也许这会有所帮助:

填充:

local a = {}
a.collection = {}
for i = 1, 100 do
    local b = {}
    a.collection[b] = true  -- 用表/对象作为索引
end

查找:

local z = a.collection[99]
if a.collection[z] then return true end

如果这不是你想做的,你可以将整个数组分成较小的桶,并使用哈希表来跟踪哪个对象属于哪个桶。

2012-02-21 03:13:31
stackoverflow用户1208078
stackoverflow用户1208078

你可能想要考虑从使用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中获取特定表变成一项非常棘手的任务(您不能只是用a.collection \ [99],您必须迭代直到找到想要的表格)。但是,您可以通过类似a.collection \ [hashFunc(z)]~=nil...的方式轻松测试a.collection中是否存在该表格。

2012-02-21 04:14:15
stackoverflow用户33252
stackoverflow用户33252

为什么将对象存储在表的值槽中而不是键槽中?

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-21 16:37:01