比较lua中的表,其中键是表
我需要比较两个表是否相等——就像在相同的内容中一样。两个表都有表作为键 例如:比较lua中的表,其中键是表,lua,Lua,我需要比较两个表是否相等——就像在相同的内容中一样。两个表都有表作为键 例如: t1 = {{1,1},{2,2}} t2 = {{1,1},{2,2}} t3 = {{1,1},{2,2},{3,3}} t1和t2应该相等,但t1和t3不应该相等。我的解决方案不是绝对的(不喜欢键),但应该适用于您提出问题的嵌套表。我的概念是递归和简单的: 从每个输入中获取一个条目,确保它们:类型匹配,都是表,并且两个表的长度相同。如果这三件事是真的,您现在可以1:1递归地比较这两个表。如果类型不匹配或表的长
t1 = {{1,1},{2,2}}
t2 = {{1,1},{2,2}}
t3 = {{1,1},{2,2},{3,3}}
t1和t2应该相等,但t1和t3不应该相等。我的解决方案不是绝对的(不喜欢键),但应该适用于您提出问题的嵌套表。我的概念是递归和简单的: 从每个输入中获取一个条目,确保它们:类型匹配,都是表,并且两个表的长度相同。如果这三件事是真的,您现在可以1:1递归地比较这两个表。如果类型不匹配或表的长度不同,则自动失败
function compare (one, two)
if type(one) == type(two) then
if type(one) == "table" then
if #one == #two then
-- If both types are the same, both are tables and
-- the tables are the same size, recurse through each
-- table entry.
for loop=1, #one do
if compare (one[loop], two[loop]) == false then
return false
end
end
-- All table contents match
return true
end
else
-- Values are not tables but matching types. Compare
-- them and return if they match
return one == two
end
end
return false
end
do
t1 = {{1,1},{2,2}}
t2 = {{1,1},{2,2}}
t3 = {{1,1},{2,2},{3,3}}
print (string.format(
"t1 == t2 : %s",
tostring(compare (t1,t2))))
print (string.format(
"t1 == t3 : %s",
tostring(compare (t1,t3))))
end
输出为:
t1 == t2 : true
t1 == t3 : false
另一种方法是以以下方式序列化两个表。这将生成一组字符串的输出,这些字符串在运行时将重新创建表。将序列化程序的输出存储在表中,而不是输出它们以进行比较 将两个表序列化为字符串集合后,将序列化表a中的所有行与序列化表B中的所有行进行比较并删除它们之间的任何重复项将非常简单。如果在处理表A的末尾,表A或表B中还有任何行,则它们不相等 用于序列化到字符串表(从PIL修改)并比较两个表a和b的代码:
function basicSerialize (o)
if type(o) == "number" then
return tostring(o)
else -- assume it is a string
return string.format("%q", o)
end
end
function save (name, value, saved, output)
saved = saved or {} -- initial value
output = output or {} -- initial value
if type(value) == "number" or type(value) == "string" then
table.insert (output, name .. " = " .. basicSerialize(value))
elseif type(value) == "table" then
if saved[value] then -- value already saved?
table.insert (output, name .. " = " .. saved[value]) -- use its previous name
else
saved [value] = name -- save name for next time
table.insert (output, name .. " = {}") -- create a new table
for k,v in pairs(value) do -- save its fields
local fieldname = string.format("%s[%s]", name, basicSerialize(k))
save (fieldname, v, saved, output)
end
end
else
error("cannot save a " .. type(value))
end
return output
end
function compareSerializedTable (t1, t2)
if (#t1 ~= #t2) then
return false
end
for i = #t1, 1, -1 do
local line = t1 [i]
for k, comp in ipairs (t2) do
if (line == comp) then
table.remove (t1, i)
table.remove (t2, k)
break
end
end
end
return (#t1 == 0 and #t2 == 0)
end
t1 = {{1,1},{2,2}}
t2 = {{1,1},{2,2}}
t3 = {{1,1},{2,2},{3,3}}
o1 = save ('t', t1)
o2 = save ('t', t2)
o3 = save ('t', t3)
print (compareSerializedTable (o1, o2)) --true
print (compareSerializedTable (o1, o3)) --false
你要找的是一张桌子。这不是语言的内置函数,因为它有许多不同的实现 一个常见的方法是深入比较。 下面的函数将深入比较表,它有第三个参数来忽略或不忽略元表
函数深度比较(t1、t2、忽略)
本地ty1=类型(t1)
本地ty2=类型(t2)
如果ty1~=ty2,那么
返回错误
结束
--可以直接比较非表类型
如果ty1~=“表”和ty2~=“表”,则
返回t1==t2
结束
--以及具有metamethod的表
本地mt=getmetatable(t1)
如果不忽略mt和mt以及mt.\uu eq,则
返回t1==t2
结束
对于k1,v1成对(t1)do
本地v2=t2[k1]
如果v2==nil或不是deepcompare(v1,v2),则
返回错误
结束
结束
对于k2,v2成对(t2)do
本地v1=t1[k2]
如果v1==nil或不是deepcompare(v1,v2),则
返回错误
结束
结束
返回真值
结束
有关更多信息,请参阅:这些表中的键不是表。在编程时,您有什么问题?展示你的方法。如果键和值可以是任意的,这将是非常复杂的。我想你可以根据自己的数据设计一个结构。