经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » 游戏设计 » 查看文章
用lua求两个数组的交集、并集和补集。
来源:cnblogs  作者:李小样bro  时间:2019/11/7 20:25:08  对本文有异议
  1. 1 -- 克隆
  2. 2 function Clone(object)
  3. 3 local lookup_table = { }
  4. 4 local function _copy(object)
  5. 5 if type(object) ~= "table" then
  6. 6 return object
  7. 7 elseif lookup_table[object] then
  8. 8 return lookup_table[object]
  9. 9 end
  10. 10 local new_table = { }
  11. 11 lookup_table[object] = new_table
  12. 12 for key, value in pairs(object) do
  13. 13 new_table[_copy(key)] = _copy(value)
  14. 14 end
  15. 15 return setmetatable(new_table, getmetatable(object))
  16. 16 end
  17. 17 return _copy(object)
  18. 18 end
  19. 19
  20. 20 -- 合并
  21. 21 function Merge(...)
  22. 22 local arrays = { ... }
  23. 23 local result = {}
  24. 24 for _,array in ipairs(arrays) do
  25. 25 for _, v in ipairs(array) do
  26. 26 table.insert(result, v)
  27. 27 end
  28. 28 end
  29. 29
  30. 30 return result
  31. 31 end
  32. 32
  33. 33 -- 交集
  34. 34 function Intersection(t1, t2)
  35. 35 local ret = {}
  36. 36 for k, v1 in pairs(t1) do
  37. 37 local equal = false
  38. 38 for k, v2 in pairs(t2) do
  39. 39 if v1 == v2 then
  40. 40 equal = true
  41. 41 break
  42. 42 end
  43. 43 end
  44. 44 if equal then
  45. 45 table.insert(ret, v1)
  46. 46 end
  47. 47 end
  48. 48 return ret
  49. 49 end
  50. 50
  51. 51 -- 补集
  52. 52 function Complement(t1, t2)
  53. 53 -- 在这个函数调用多次并且是同一个数组时, 如果不写标号1这行, 下边标号2和标号3的元素移除会对传过来的数组有污染。
  54. 54 local t1, t2 = Clone(t1), Clone(t2) -- 标号1
  55. 55 for i = #t1, 1, -1 do
  56. 56 for j = #t2, 1, -1 do
  57. 57 if t1[i] == t2[j] then
  58. 58 table.remove(t1, i) -- 标号2
  59. 59 table.remove(t2, j) -- 标号3
  60. 60 end
  61. 61 end
  62. 62 end
  63. 63
  64. 64 if #t1 ~= 0 then
  65. 65 return t1
  66. 66 else
  67. 67 return t2
  68. 68 end
  69. 69 end
  70. 70
  71. 71 -- 并集
  72. 72 function Aggregate(t1, t2)
  73. 73 local ret = Merge(t1, t2)
  74. 74 local t = {}
  75. 75 for _, v1 in pairs(ret) do
  76. 76 local exist = false
  77. 77 for _, v2 in pairs(t) do
  78. 78 if v1 == v2 then
  79. 79 exist = true
  80. 80 end
  81. 81 end
  82. 82 if not exist then
  83. 83 table.insert(t, v1)
  84. 84 end
  85. 85 end
  86. 86 return t
  87. 87 end
  88. 88
  89. 89 local t1 = {1, 2, 3, 4, 5, 8}
  90. 90 local t2 = {6, 1, 3, 7}
  91. 91 local t3 = {1, 2, 3, 8} -- 补集专用
  92. 92
  93. 93 -- 并集
  94. 94 print("-------------并集--------------")
  95. 95 local agg = Aggregate(t1, t2)
  96. 96 for k,v in pairs(agg) do
  97. 97 print(k,v)
  98. 98 end
  99. 99
  100. 100 print("-------------分割线--------------")
  101. 101 print("")
  102. 102
  103. 103 -- 补集
  104. 104 print("-------------补集--------------")
  105. 105 local com = Complement(t1, t3)
  106. 106 for k,v in pairs(com) do
  107. 107 print(k,v)
  108. 108 end
  109. 109
  110. 110 print("-------------分割线--------------")
  111. 111 print("")
  112. 112
  113. 113 -- 交集
  114. 114 print("-------------交集--------------")
  115. 115 local inter = Intersection(t1, t2)
  116. 116 for k,v in pairs(inter) do
  117. 117 print(k,v)
  118. 118 end

 

原文链接:http://www.cnblogs.com/erdiba/p/11812699.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号