• 用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
  • 相关阅读:
    不用循如何计算数组累加和
    mysql通过binlog恢复删除数据
    windows下打开binlog
    mysql的binlog
    枚举实现线程池单例
    AtomicInteger的CAS算法浅析
    不用循环如何计算1累加到100
    MongoDB查询报错:class com.mongodb.MongoSecurityException: Exception authenticating MongoCredential
    Senparc.Weixin微信开发(3) 自定义菜单与获取用户组
    Senparc.Weixin微信开发(2) 消息机制和上下文(Session)
  • 原文地址:https://www.cnblogs.com/xihabiji/p/11812699.html
Copyright © 2020-2023  润新知