用lua求两个数组的交集、并集和补集。

  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
原文地址:https://www.cnblogs.com/erdiba/p/11812699.html