LUA 关于取出两个table中不同元素的算法。
首先我建立两个table定义一个临时table,把T_letter_tbl赋值给临时table,然后用一个双循环遍历两个table,找出两个table相同的一项,清空我想...
首先我建立两个table
定义一个临时table,把T_letter_tbl赋值给临时table,然后用一个双循环遍历两个table,找出两个table相同的一项,清空
我想用Interim_tbl[j]=nil清空这些元素,循环只能执行一次,
如果我用table.remove来做,则出现这种情况
并且求这种操作的其他算法 展开
定义一个临时table,把T_letter_tbl赋值给临时table,然后用一个双循环遍历两个table,找出两个table相同的一项,清空
我想用Interim_tbl[j]=nil清空这些元素,循环只能执行一次,
如果我用table.remove来做,则出现这种情况
并且求这种操作的其他算法 展开
2个回答
展开全部
【我理解下你的意思
你是要把 T_letter_tbl 中所有元素的 letter标签和 和 hope_letter_tbl 中的元素比较,如果 发现重复 的 则删除 T_letter_tbl 中的 重复标签吗?
【一般做法】用 lua 做这种很容易,但是要注意方法,不是比较,那样遍历比较 效率太低。先把 需要比较的 table 的元素作为 索引 建立一个 hash
直接取元素 进行 标签判断,
下面是一个演示:table.print 自定义的输出,可以删去,自己选择输出方式
function table.print ( tbl, name )
name = name or "table"
local prompt = ' '
local i = 1
local printed = {}
local function tostring2 ( var )
if (type( var) == "string" ) then
return '"' ..var ..'"'
end
return tostring(var )
end
local function itor ( t , i )
printed[ tostring( t)] = true;
for key , ele in pairs (t ) do
if not (type( ele) == "table" ) then
print( string .format('%s[%s] = %s;' , string.rep( prompt, i ), tostring2 ( key ),tostring2 (ele )) )
elseif printed [tostring( ele)] then
print( string .format('%s[%s] = %s;' , string.rep( prompt, i ), tostring2 ( key ),tostring2 (ele )) )
else
print( string .format('%s[%s] = {' , string.rep( prompt, i ), tostring2 ( key )) )
i = i + 1
itor( ele, i)
i = i - 1
print( string .format('%s};' , string.rep( prompt, i )) )
end
end
end
print( string.format( "%s = {" , name ) )
itor( tbl, i)
print("};" )
end
-----------------------------------------------------
tbl_letter_HOPE = {
[1] = "bbbbbb";
[2] = "ffffff";
[3] = "cccccc";
[4] = "xxxxxx";
[5] = "eeeeee";
};
tbl_letter_T = {
[1] = {["letter"] = "Y"};
[2] = {["letter"] = "M"};
[3] = {["letter"] = "P"};
[4] = {["letter"] = "K"};
[5] = {["letter"] = "bbbbbb"};
[6] = {["letter"] = "R"};
[7] = {["letter"] = "Q"};
[8] = {["letter"] = "xxxxxx"};
[9] = {["letter"] = "L"};
[10] = {["letter"] = "D"};
[11] = {["letter"] = "B"};
[12] = {["letter"] = "ffffff"};
[13] = {["letter"] = "Z"};
[14] = {["letter"] = "T"};
[15] = {["letter"] = "["};
[16] = {["letter"] = "cccccc"};
[17] = {["letter"] = "E"};
[18] = {["letter"] = "C"};
[19] = {["letter"] = "W"};
[20] = {["letter"] = "I"};
[21] = {["letter"] = "F"};
[22] = {["letter"] = "eeeeee"};
[23] = {["letter"] = "O"};
[24] = {["letter"] = "X"};
[25] = {["letter"] = "U"};
[26] = {["letter"] = "S"};
};
--- 根据 tbl_letter_HOPE 中的元素 去除 tbl_letter_T 中的元素
--
local function main ()
local tbl_erase = {}
for key, ele in pairs(tbl_letter_HOPE) do
-- 不考虑 元素权重则 改为 = true
tbl_erase[tostring(ele)] = (tbl_erase[tostring(ele)] or 0) + 1
end
for key, ele in pairs(tbl_letter_T) do
if tbl_erase[ele.letter] then
-- 移除 整行 [12] = {["letter"] = "ffffff"};
tbl_letter_T[key] = nil
-- 还是 一个标签 letter
--tbl_letter_T[key].letter = nil
end
end
table.print(tbl_letter_T)
end
startTime = os.time()
main()
print( string.format(">> This function cost: %s ms", tostring(os.time()-startTime) ) )
【附】
如果只想 获得去除给定元素后的 table
可以先 复制原 tbl_letter_T
注意:
不要用 浅复制 你之前 那个代码 可能 就是 希望做一个 tbl_letter_T 的副本
但是 使用 浅复制 相当于仅复制了指向table的句柄。
tbl_Interim = tbl_letter_T -- 2个变量指向同一个 table表
要用
for key, ele in pairs(tbl_letter_T) do
tbl_Interim [key] = ele
end
展开全部
不要用remove操作表
因为remove操作后表的长度改变了 后面的元素也会往前移
而你循环的次数则是在一开始就定好了 这就会导致最后几次访问出错
打个比方
两个table 各15个元素 只有第7个那一对是相同的
你for到第7次的时候remove了第7个 而原来的第8个 变成了7 9变成了8
当你for到15的时候 已经是个nil了
因为remove操作后表的长度改变了 后面的元素也会往前移
而你循环的次数则是在一开始就定好了 这就会导致最后几次访问出错
打个比方
两个table 各15个元素 只有第7个那一对是相同的
你for到第7次的时候remove了第7个 而原来的第8个 变成了7 9变成了8
当你for到15的时候 已经是个nil了
追问
所以我用了一个临时table来进行操作啊。
追答
把T_letter_tbl赋值给临时table 如果你不是用拷贝,你这里是把原来的table复制了一次呢 还是直接赋值,如果是直接赋值的话,还是对原来的table进行操作
当表的规模不大的时候 我推荐的最简单的方法 (但是这个方法效率并不高 )
local t1 = {xxx}
local t2 = {yyy}
local t3 = {}
for i = 1,#t1 do
for j = 1,#t2 do
if compare(t1[i],t2[j]) then
--重复就不做事了
else
local exist = false
for k = 1,#t3 do
if compare(t1[i],t3[k]) then
exist = true
end
end
if not exist then
table.insert(t3,t1[i])
end
end
end
end
如果比较大的规模的话 就得考虑算法的优化了
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询