lua list 封裝

Ruthless發表於2022-09-02
-- list索引從1開始
list = {}
list.__index = list
 
function list:new()
    local o = {}
    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:get(index)
    local count = self:count()
    if (count == 0 or count < index) then
        return nil
    end
    return self[index]
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

-- 索引index在[1,count+1]插入成功,其他位置插入會失敗
function list:insert(index, item)
    table.insert(self, index, item)
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 comparison == nil then
        table.sort(self)
    else
        table.sort(self, comparison)
    end
end

--list宣告初始化
local mylist = list:new()
mylist:add('11')
mylist:add('22')
mylist:add('33')
mylist:add('44')
mylist:add('11')

-- mylist:clear()
-- print(mylist:contains('222'))
-- print(mylist:get(0))
-- print(mylist:get(3))
--print(mylist:indexOf("11"))
--print(mylist:lastIndexOf("111"))
--mylist:insert(1, "aa")
-- mylist:remove("11")
-- mylist:removeAt("11")

-- 排序
mylist:sort(function(a,b)
    -- return a > b -- 降序
    return a < b -- 升序
end)

print("count="..mylist:count())
 
-- list for 迴圈
for i,v in ipairs(mylist) do
    print(i,v)
end

 

相關文章