【问题标题】:Lua Table Comparisons Within Tables表内的 Lua 表比较
【发布时间】:2012-03-11 09:49:09
【问题描述】:

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

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

提前致谢!

【问题讨论】:

    标签: dictionary lua lua-table


    【解决方案1】:

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

    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
    

    【讨论】:

    • 谢谢!这个解决方案很完美。
    【解决方案2】:

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

    填充:

    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
    

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

    【讨论】:

    • 由于某种原因这对我不起作用,我不返回 true。
    • lua-users.org/wiki/TablesTutorial Section "Keys are references",一定要对表使用相同的引用,而不是重新创建相同的第二个表。
    【解决方案3】:

    您可能需要考虑从使用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 中。

    【讨论】:

      猜你喜欢
      • 2021-04-03
      • 2018-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-06
      • 1970-01-01
      • 2011-10-12
      • 2023-03-29
      相关资源
      最近更新 更多