表中的Lua表比较

时间:2012-02-21 03:04:51

标签: dictionary lua lua-table

所以我有一个表,其中包含对其他表的引用,如:

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

提前致谢!

3 个答案:

答案 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中。)