LUA 关于取出两个table中不同元素的算法。

首先我建立两个table定义一个临时table,把T_letter_tbl赋值给临时table,然后用一个双循环遍历两个table,找出两个table相同的一项,清空我想... 首先我建立两个table

定义一个临时table,把T_letter_tbl赋值给临时table,然后用一个双循环遍历两个table,找出两个table相同的一项,清空

我想用Interim_tbl[j]=nil清空这些元素,循环只能执行一次,

如果我用table.remove来做,则出现这种情况

并且求这种操作的其他算法
展开
 我来答
flameleo11
推荐于2016-12-02 · TA获得超过5343个赞
知道大有可为答主
回答量:1943
采纳率:50%
帮助的人:993万
展开全部

【我理解下你的意思
你是要把 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
yaoyue1019
2013-08-09 · 知道合伙人互联网行家
yaoyue1019
知道合伙人互联网行家
采纳数:804 获赞数:3392
擅长lua脚本 与android前端交互设计

向TA提问 私信TA
展开全部
不要用remove操作表
因为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

如果比较大的规模的话 就得考虑算法的优化了

本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式