function newset()
local reverse = {} --以数据为key,数据在set中的位置为value
local set = {} --一个数组,其中的value就是要管理的数据
return setmetatable(set,{__index = {
insert = function(set,value)
if not reverse[value] then
table.insert(set,value)
reverse[value] = table.getn(set)
end
end,
remove = function(set,value)
local index = reverse[value]
if index then
reverse[value] = nil
local top = table.remove(set) --删除数组中最后一个元素
if top ~= value then
--若不是要删除的值,则替换它
reverse[top] = index
set[index] = top
end
end
end,
find = function(set,value)
local index = reverse[value]
return (index and true or false)
end,
}})
end
local s = newset()
s:insert("hi0")
s:insert("hi1")
for _,Value in ipairs(s) do
print(Value)
end
print(s:find("hi0"))
s:remove("hi0")
print(s:find("hi0"))
--[[--output--
hi0
hi1
true
false
--]]
用Lua实现插入、删除和查找时间复杂度为O(1)的集合,布布扣,bubuko.com
原文:http://blog.csdn.net/maximuszhou/article/details/22313773