Dictionary 表内的Lua表比较

Dictionary 表内的Lua表比较,dictionary,lua,lua-table,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

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

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个对象中迭代。这个设置使我的程序爬行。有没有一种方法可以生成某种键,它不是字符串,也不是表与表之间的比较,而是一行代码?比如:

如果a.collection[{z}],则返回true end


提前谢谢

不知道它是否更快,但这可能有帮助:

填充:

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
local z = a.collection[99]
if a.collection[z] then return true end

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

不知道它是否更快,但这可能有帮助:

填充:

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
local z = a.collection[99]
if a.collection[z] then return true end

如果这不是你想要做的,你可以把整个数组分解成更小的桶,并用散列来跟踪哪个对象属于哪个桶。

你可能想考虑从使用对()切换到使用正则for循环并对表进行索引。
for i=1, #a.collection do
    if a.collection[i] == z then
        return true
    end
end
我比较了使用pairs()和table索引遍历100万个表集合的速度,每次索引都要快一点。您可以使用os.clock()来评测代码


除了使用某种散列函数将唯一索引设置到a.collection表中之外,我真的想不出一种更快的解决方案。然而,这样做会使获得一个特定的表成为一项非常重要的任务(你不仅可以做一个.collection[99],你还必须迭代直到找到一个你想要的表。但是,你可以通过做类似于a.collection[hashFunc(z)]~=nil…)的事情来轻松地测试该表是否在a.collection中

您可能想考虑从使用SUBSH()切换到使用常规for循环并对表进行索引,在较大的表集合中,对()的速度似乎较慢。
for i=1, #a.collection do
    if a.collection[i] == z then
        return true
    end
end
我比较了使用pairs()和table索引遍历100万个表集合的速度,每次索引都要快一点。您可以使用os.clock()来评测代码


除了使用某种散列函数将唯一索引设置到a.collection表中之外,我真的想不出一种更快的解决方案。然而,这样做会使获得一个特定的表成为一项非常重要的任务(你不仅可以做一个.collection[99],你还必须迭代直到找到一个你想要的表。但是,你可以通过做类似于a.collection[hashFunc(z)]~=nil…)的事情来轻松地测试该表是否在a.collection中

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

local a = newObject()
a.collection = {}
for i = 1, 100 do
    local b = newObject()
    a.collection[b] = i
end 
查看特定对象是否在“a”中

如果需要对集合进行整数索引访问,请以两种方式进行存储:

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
local z = a.collection[99]
if a.collection[z] then return true end

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

local a = newObject()
a.collection = {}
for i = 1, 100 do
    local b = newObject()
    a.collection[b] = i
end 
查看特定对象是否在“a”中

如果需要对集合进行整数索引访问,请以两种方式进行存储:

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
local z = a.collection[99]
if a.collection[z] then return true end

由于某种原因,这对我不起作用,我不会返回真实的。在“键是引用”部分,请确保对表使用相同的引用,而不是重新创建相同的第二个表。由于某些原因,这对我不起作用,我不会返回true。“键是引用”部分,请确保对表使用相同的引用,而不是重新创建相同的第二个表。谢谢!这个解决方案非常完美。谢谢!这个解决方案是完美的。