2013-03-18 60 views
1

在Lua v。5.2中,如何獲得兩個表中所有字符串的鍵的補碼?如何獲得兩個Lua表的補碼

理想情況下,我想有一個函數是這樣的:

table.complement (t1, t2) 

...其中的回報是一個表,它是鍵/值對的補表1和表2.是,返回的表只包含不在兩個表中的鍵。

使用案例盯着我的是一個NoteCase Pro大綱的腳本,它將在執行將當前節點拆分爲多個操作之前獲取唯一同級節點ID(每個22個字符)的「before」列表獲取兄弟節點ID的新「之後」列表,將該列表減少爲兩個列表的補充,然後降級新創建的節點以成爲子節點或層次結構中的原始當前節點。

+0

你能對鍵值的互補詳細點嗎? – hjpotter92 2013-03-18 14:35:53

+0

「補充」?你的意思是t1 set-minus t2嗎? – Cubic 2013-03-18 15:21:26

+0

編輯更清楚。我指的是* both *表中不存在的一組鍵/值對,即新創建的節點的ID。 – user2182586 2013-03-18 15:48:38

回答

4
local function symm_diff(t1, t2) 
    local t = {} 
    for k, v in pairs(t1) do 
    if t2[k] == nil then t[k] = v end 
    end 
    for k, v in pairs(t2) do 
    if t1[k] == nil then t[k] = v end 
    end 
    return t 
end 
+0

謝謝大家,我已經與葉戈爾的解決方案一起工作。我還要感謝他所需的詞彙課。 – user2182586 2013-03-23 23:37:27

0

你沒有任何理由不能自己寫這個東西......像這樣的東西?

function table.complement(t1, t2) 
    local res = {} 

    for _,v1 in pairs(t1) do 
     local found = false 
     for _,v2 in pairs(t2) do 
      if (v1 == v2) then 
       found = true 
       break 
      end 
     end 
     if not found then table.insert(res, v1) end 
    end 

    for _,v2 in pairs(t2) do 
     local found = false 
     for _,v1 in pairs(t1) do 
      if (v2 == v1) then 
       found = true 
       break 
      end 
     end 
     if not found then table.insert(res, v2) end 
    end 

    return res 
end 

local t1 = {"stuff", "more", "things"} 
local t2 = {"stuff", "junk", "things"} 

table.foreach(table.complement(t1, t2), print) 

它打印

1 more 
2 junk 
+0

'table.foreach'在Lua 5.1中被棄用,並且在Lua 5.2中不存在。 – 2013-03-18 18:09:43

+0

是的,這只是方便,所以我用它來測試片段。 – 2013-03-18 18:24:36