lua实现List及Dictionary

转载: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 @ 2017-11-07 22:15  三页菌  阅读(7353)  评论(0编辑  收藏  举报