Fork me on GitHub
随笔 - 215  文章 - 13  trackbacks - 0
<2018年12月>
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345


专注即时通讯及网游服务端编程
------------------------------------
Openresty 官方模块
Openresty 标准模块(Opm)
Openresty 三方模块
------------------------------------
本博收藏大部分文章为转载,并在文章开头给出了原文出处,如有再转,敬请保留相关信息,这是大家对原创作者劳动成果的自觉尊重!!如为您带来不便,请于本博下留言,谢谢配合。

常用链接

留言簿(1)

随笔分类

随笔档案

相册

Awesome

Blog

Book

GitHub

Link

搜索

  •  

积分与排名

  • 积分 - 211162
  • 排名 - 118

最新评论

阅读排行榜

lua实现List及Dictionary

转载:http://www.cnblogs.com/sanyejun/p/7801432.html

http://www.maosongliang.com/archives/122

参考 http://blog.csdn.net/jason_520/article/details/54173685

实现List

List = {}
List.__index = List
 
function List:New(t)
    local o = {itemType = t}
    setmetatable(o, self)
    return o
end
 
function List:Add(item)
    table.insert(self, item)
end
 
function List:Clear()
    local count = self:Count()
    for i=count,1,-1 do
        table.remove(self)
    end
end
 
function List:Contains(item)
    local count = self:Count()
    for i=1,count do
        if self[i] == item then
            return true
        end
    end
    return false
end
 
function List:Count()
    return table.getn(self)
end
 
function List:Find(predicate)
    if (predicate == nil or type(predicate) ~= 'function') then
        print('predicate is invalid!')
        return
    end
    local count = self:Count()
    for i=1,count do
        if predicate(self[i]) then 
            return self[i] 
        end
    end
    return nil
end
 
function List:ForEach(action)
    if (action == nil or type(action) ~= 'function') then
        print('action is invalid!')
        return
    end
    local count = self:Count()
    for i=1,count do
        action(self[i])
    end
end
 
function List:IndexOf(item)
    local count = self:Count()
    for i=1,count do
        if self[i] == item then
            return i
        end
    end
    return 0
end
 
function List:LastIndexOf(item)
    local count = self:Count()
    for i=count,1,-1 do
        if self[i] == item then
            return i
        end
    end
    return 0
end
 
function List:Insert(index, item)
    table.insert(self, index, item)
end
 
function List:ItemType()
    return self.itemType
end
 
function List:Remove(item)
    local idx = self:LastIndexOf(item)
    if (idx > 0) then
        table.remove(self, idx)
        self:Remove(item)
    end
end
 
function List:RemoveAt(index)
    table.remove(self, index)
end
 
function List:Sort(comparison)
    if (comparison ~= nil and type(comparison) ~= 'function') then
        print('comparison is invalid')
        return
    end
    if func == nil then
        table.sort(self)
    else
        table.sort(self, func)
    end
end

 

实现Dic

Dictionary = {}
Dictionary.__index = Dictionary
 
function Dictionary:New(tk, tv)
    local o = {keyType = tk, valueType = tv}
    setmetatable(o, self)
    o.keyList = {}
    return o
end
 
function Dictionary:Add(key, value)
    if self[key] == nil then
        self[key] = value
        table.insert(self.keyList, key)
    else
        self[key] = value
    end
end
 
function Dictionary:Clear()
    local count = self:Count()
    for i=count,1,-1 do
        self[self.keyList[i]] = nil
        table.remove(self.keyList)
    end
end
 
function Dictionary:ContainsKey(key)
    local count = self:Count()
    for i=1,count do
        if self.keyList[i] == key then
            return true
        end
    end
    return false
end
 
function Dictionary:ContainsValue(value)
    local count = self:Count()
    for i=1,count do
        if self[self.keyList[i]] == value then
            return true
        end
    end
    return false
end
 
function Dictionary:Count()
    return table.getn(self.keyList)
end
 
function Dictionary:Iter()
    local i = 0
    local n = self:Count()
    return function ()
        i = i + 1
        if i <= n then
            return self.keyList[i]
        end
        return nil
    end
end
 
function Dictionary:Remove(key)
    if self:ContainsKey(key) then
        local count = self:Count()
        for i=1,count do
            if self.keyList[i] == key then
                table.remove(self.keyList, i)
                break
            end
        end
        self[key] = nil
    end
end
 
function Dictionary:KeyType()
    return self.keyType
end
 
function Dictionary:ValueType()
    return self.valueType
end

其中Dictionary:Iter是用来遍历Dictionary的,用法如下:

Lua

local dic = Dictionary:New('string', 'string')
dic:Add('BeiJing', '010')
dic:Add('ShangHai', '021')

while true do
    local it = dic:Iter()
    if it ~= nil then
        local key = it()
        local value = dic[key]
        print('key: ' .. tostring(key) .. ' value: ' .. tostring(value))
    else
        break
    end
end

local dic = Dictionary:New('string', 'string')
dic:Add('BeiJing', '010')
dic:Add('ShangHai', '021')
 
while true do
    local it = dic:Iter()
    if it ~= nil then
        local key = it()
        local value = dic[key]
        print('key: ' .. tostring(key) .. ' value: ' .. tostring(value))
    else
        break
    end
end
posted on 2018-05-08 11:07 思月行云 阅读(1067) 评论(0)  编辑 收藏 引用 所属分类: Nginx\Openresty

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理