57 lines
1.8 KiB
Lua
57 lines
1.8 KiB
Lua
|
|
SetPrototype = {
|
|||
|
|
__index = {
|
|||
|
|
union = function(self, other)
|
|||
|
|
local res = Set{}
|
|||
|
|
for k in pairs(self) do res[k] = true end
|
|||
|
|
for k in pairs(other) do res[k] = true end
|
|||
|
|
return res
|
|||
|
|
end,
|
|||
|
|
intersection = function(self, other)
|
|||
|
|
local res = Set{}
|
|||
|
|
for k in pairs(self) do res[k] = other[k] end
|
|||
|
|
return res
|
|||
|
|
end,
|
|||
|
|
difference = function(self, other)
|
|||
|
|
local res = Set{}
|
|||
|
|
for k in pairs(self) do
|
|||
|
|
if not other[k] then res[k] = true end
|
|||
|
|
end
|
|||
|
|
return res
|
|||
|
|
end,
|
|||
|
|
symmetric_difference = function(self, other)
|
|||
|
|
return self:difference(other):union(other:difference(self))
|
|||
|
|
end
|
|||
|
|
},
|
|||
|
|
-- return string representation of set
|
|||
|
|
__tostring = function(self)
|
|||
|
|
-- list to collect all elements from the set
|
|||
|
|
local l = {}
|
|||
|
|
for k in pairs(self) do l[#l+1] = k end
|
|||
|
|
return "{" .. table.concat(l, ", ") .. "}"
|
|||
|
|
end,
|
|||
|
|
-- allow concatenation with other types to yield string
|
|||
|
|
__concat = function(a, b)
|
|||
|
|
return (type(a) == 'string' and a or tostring(a)) ..
|
|||
|
|
(type(b) == 'string' and b or tostring(b))
|
|||
|
|
end
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function Set(items)
|
|||
|
|
local _set = {}
|
|||
|
|
setmetatable(_set, SetPrototype)
|
|||
|
|
for _, item in ipairs(items) do _set[item] = true end
|
|||
|
|
return _set
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
A = Set{"John", "Serena", "Bob", "Mary", "Serena"}
|
|||
|
|
B = Set{"Jim", "Mary", "John", "Jim", "Bob"}
|
|||
|
|
|
|||
|
|
print("Set A: " .. A)
|
|||
|
|
print("Set B: " .. B)
|
|||
|
|
|
|||
|
|
print("\nSymm. difference (A\\B)∪(B\\A): " .. A:symmetric_difference(B))
|
|||
|
|
print("Union A∪B : " .. A:union(B))
|
|||
|
|
print("Intersection A∩B : " .. A:intersection(B))
|
|||
|
|
print("Difference A\\B : " .. A:difference(B))
|
|||
|
|
print("Difference B\\A : " .. B:difference(A))
|