1 -- 克隆 2 function Clone(object) 3 local lookup_table = { } 4 local function _copy(object) 5 if type(object) ~= "table" then 6 return object 7 elseif lookup_table[object] then 8 return lookup_table[object] 9 end 10 local new_table = { } 11 lookup_table[object] = new_table 12 for key, value in pairs(object) do 13 new_table[_copy(key)] = _copy(value) 14 end 15 return setmetatable(new_table, getmetatable(object)) 16 end 17 return _copy(object) 18 end 19 20 -- 合併 21 function Merge(...) 22 local arrays = { ... } 23 local result = {} 24 for _,array in ipairs(arrays) do 25 for _, v in ipairs(array) do 26 table.insert(result, v) 27 end 28 end 29 30 return result 31 end 32 33 -- 交集 34 function Intersection(t1, t2) 35 local ret = {} 36 for k, v1 in pairs(t1) do 37 local equal = false 38 for k, v2 in pairs(t2) do 39 if v1 == v2 then 40 equal = true 41 break 42 end 43 end 44 if equal then 45 table.insert(ret, v1) 46 end 47 end 48 return ret 49 end 50 51 -- 補集 52 function Complement(t1, t2) 53 -- 在這個函數調用屢次而且是同一個數組時, 若是不寫標號1這行, 下邊標號2和標號3的元素移除會對傳過來的數組有污染。 54 local t1, t2 = Clone(t1), Clone(t2) -- 標號1 55 for i = #t1, 1, -1 do 56 for j = #t2, 1, -1 do 57 if t1[i] == t2[j] then 58 table.remove(t1, i) -- 標號2 59 table.remove(t2, j) -- 標號3 60 end 61 end 62 end 63 64 if #t1 ~= 0 then 65 return t1 66 else 67 return t2 68 end 69 end 70 71 -- 並集 72 function Aggregate(t1, t2) 73 local ret = Merge(t1, t2) 74 local t = {} 75 for _, v1 in pairs(ret) do 76 local exist = false 77 for _, v2 in pairs(t) do 78 if v1 == v2 then 79 exist = true 80 end 81 end 82 if not exist then 83 table.insert(t, v1) 84 end 85 end 86 return t 87 end 88 89 local t1 = {1, 2, 3, 4, 5, 8} 90 local t2 = {6, 1, 3, 7} 91 local t3 = {1, 2, 3, 8} -- 補集專用 92 93 -- 並集 94 print("-------------並集--------------") 95 local agg = Aggregate(t1, t2) 96 for k,v in pairs(agg) do 97 print(k,v) 98 end 99 100 print("-------------分割線--------------") 101 print("") 102 103 -- 補集 104 print("-------------補集--------------") 105 local com = Complement(t1, t3) 106 for k,v in pairs(com) do 107 print(k,v) 108 end 109 110 print("-------------分割線--------------") 111 print("") 112 113 -- 交集 114 print("-------------交集--------------") 115 local inter = Intersection(t1, t2) 116 for k,v in pairs(inter) do 117 print(k,v) 118 end