用lua求两个数组的交集、并集和补集,最后得到两个数组不公有的元素。

 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

猜你喜欢

转载自www.cnblogs.com/erdiba/p/11812699.html
今日推荐