- 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