1 -- 实现过程就是 2 -- 1. 求两个数组的交集 3 -- 2. 然后用交集分别对两个数组求各自的补集 4 -- 3. 将两个数组的补集合并,得到两个数组不公有得元素 5 -- 克隆 6 function Clone(object) 7 local lookup_table = { } 8 local function _copy(object) 9 if type(object) ~= "table" then 10 return object 11 elseif lookup_table[object] then 12 return lookup_table[object] 13 end 14 local new_table = { } 15 lookup_table[object] = new_table 16 for key, value in pairs(object) do 17 new_table[_copy(key)] = _copy(value) 18 end 19 return setmetatable(new_table, getmetatable(object)) 20 end 21 return _copy(object) 22 end 23 24 -- 合并 25 function Merge(...) 26 local arrays = { ... } 27 local result = {} 28 for _,array in ipairs(arrays) do 29 for _, v in ipairs(array) do 30 table.insert(result, v) 31 end 32 end 33 34 return result 35 end 36 37 -- 交集 38 function Intersection(t1, t2) 39 local ret = {} 40 for k, v1 in pairs(t1) do 41 local equal = false 42 for k, v2 in pairs(t2) do 43 if v1 == v2 then 44 equal = true 45 break 46 end 47 end 48 if equal then 49 table.insert(ret, v1) 50 end 51 end 52 return ret 53 end 54 55 -- 补集 56 function Complement(t1, t2) 57 -- 这里有个坑,如果不写标号1这行, 下边标号2和标号3的移除会对传过来的数组有污染。 58 local t1, t2 = Clone(t1), Clone(t2) -- 标号1 59 for i = #t1, 1, -1 do 60 for j = #t2, 1, -1 do 61 if t1[i] == t2[j] then 62 table.remove(t1, i) -- 标号2 63 table.remove(t2, j) -- 标号3 64 end 65 end 66 end 67 68 if #t1 ~= 0 then 69 return t1 70 else 71 return t2 72 end 73 end 74 75 -- 并集 76 function Aggregate(t1, t2) 77 local t = Intersection(t1, t2) 78 -- 上面说的坑原因是数组t是公用的,当执行一次后,第二次执行t中已经没有元素 79 local ret = Merge(Complement(t, t1), Complement(t, t2)) 80 return ret 81 end 82 83 local t1 = {1, 2, 3, 4, 5, 8} 84 85 local t2 = {1, 3, 5, 6} 86 local agg = Aggregate(t1, t2) 87 88 for k,v in pairs(agg) do 89 print(k,v) 90 end
用lua求两个数组的交集、并集和补集,最后得到两个数组不公有的元素。
猜你喜欢
转载自www.cnblogs.com/erdiba/p/11812699.html
今日推荐
周排行