Lua、List模块编写

本程序编写了Lua模块List,包含了类创建、获取大小、判断是否为空、获取子列表、移除指定下标元素、添加元素。

List模块:

#Declare module List


-- declare List
List = {
	size=0 -- 列表大小
}


-- declare functions
--~ 构造方法
function List:new(...)
	-- 如果存在值,将值构建成table并设置大小
	local values = {...}
	values.size = table.getn(values)

	-- 设置元表
	setmetatable(values, {
		-- 绑定List元表(新表查询不存在时,从List表查询)
		__index = self,
		-- 返回字符串
		__tostring = function(self)
			local str = "["
			for i = 1, self.size do
				-- 如果元素为元表,获取元表值
				if "table" == type(self[i]) then
					str = str .. "{" .. table.concat(self[i], ", ") .. "}, "
				else -- 否则,直接连接
					str = str .. tostring(self[i]) .. ", "
				end
			end
			return string.sub(str, 1, ((self.size > 0 and -3) or -1)) .. "]"
		end,
		-- 加法操作
		__add = function(self, tab)
			-- 如果不是元表,抛出异常
			if "table" ~= type(tab) then
				error(tostring(tab) .. " is not a table")
			end

			-- 创建新表,添加当前表和tab表元素
			local temp = List()
			for i = 1, self.size do
				temp:add(self[i])
			end
			for i, v in ipairs(tab) do
				temp:add(v)
			end
			return temp
		end
	})
	return values
end

--~ 添加指定值
function List:add(e, index)
	if not index then		-- index为空,添加到列表末尾
		self[self.size + 1] = e
	elseif "number" ~= type(index) then 	-- index非数字,抛出异常
		error(tostring(index) .. " is not a number")
	else
		-- 负数下标转换
		if index < 0 then
			index = self.size + index + 2
		end

		index = math.ceil(index)

		-- 下标越界,抛出异常
		if index > self.size + 1 or index <= 0 then
			error("Array out of bound: " .. tostring(index))
		end

		-- 后移index开始的元素,将e付给index下标元素
		local i = self.size
		while i >= index do
			self[i + 1] = self[i]
			i = i - 1
		end
		self[index] = e
	end

	self.size = self.size + 1
end

--~ 移除指定下标元素
function List:remove(index)
	-- 如果非数字,抛出异常
	if ("number" ~= type(index)) then
		error(tostring(index) .. " is not a number")
	end

	-- 负数,转换为正数
	if index < 0 then
		index = self.size + index + 1
	end

	index = math.ceil(index)

	-- 获取移除位元素(不存在时返回nil)
	local e = self[index]
	-- 前移从index开始的元素
	for i = index, self.size do
		self[i] = self[i + 1]
	end
	self.size = self.size - 1

	return e
end


--~ 获取子列表
function List:sub(startIndex, endIndex)
	-- 判断startIndex是否为数字
	if ("number" ~= type(startIndex)) then
		error(tostring(startIndex) .. " is not a number")
	end

	-- 将下标转换为正数
	if startIndex < 0 then
		startIndex = self.size + startIndex + 1
	end

	-- 如果下标越界,抛出异常
	if startIndex <= 0 or startIndex > self.size then
		error("Array out of bound: " .. tostring(startIndex))
	end

	-- 创建List
	local temp = List:new()
	-- 如果endIndex为空
	if not endIndex then
		-- temp添加元素
		for i = startIndex, self.size do
			temp:add(self[i])
		end
	else -- endIndex不为空
		-- 判断endIndex是否为数字
		if ("number" ~= type(endIndex)) then
			error(tostring(endIndex) .. " is not a number")
		end

		-- 转换为正数
		if endIndex < 0 then
			endIndex = self.size + endIndex + 1
		end

		-- 如果endIndex < startIndex,抛出异常
		if endIndex < startIndex then
				error("endtIndex(" .. tostring(endIndex) .. ") can not be less than startIndex(" .. startIndex .. ")")
		end

		-- 如果下标越界,抛出异常
		if endIndex <= 0 or endIndex > self.size then
			error("Array out of bound: " .. tostring(endIndex))
		end

		-- temp添加元素
		for i = startIndex, endIndex do
			temp:add(self[i])
		end
	end

	return temp
end

--~ 获取列表长度
function List:length()
	return self.size
end

--~ 判断列表是否为空
function List:isEmpty()
	return 0 == self:length()
end


-- set meta table
setmetatable(List, {
	-- List(...)方法
	__call = function(self, ...)
		return self:new(...)
	end
})


-- return module
return List


测试1:

-- 导入模块
require "List"

-- 创建列表
list1 = List:new(1, 2, 3, 4)
list2 = List(1, true, 28.39, "name", {1, 4, 4})
list3 = List()

-- 初始情况
print(list1, list1:length(), list1:isEmpty())
print(list2, list2:length(), list2:isEmpty())
print(list3, list3:length(), list3:isEmpty())

 

测试2:

-- 导入模块
require "List"

-- 创建列表
list1 = List:new(1, 2, 3, 4)


-- 添加操作(下标从1开始,-1开始表示倒数下标)
list1:add("a")
list1:add("b", 1)
list1:add("c", -1)
list1:add("d", list1:length() / 2)
print("\r添加操作:")
print(table.concat(list1, ", "))
print("长度:" .. list1:length(), "\r是否为空: " .. tostring(list1:isEmpty()))

测试3:

-- 导入模块
require "List"

-- 创建列表
list1 = List:new(1, 2, 3, 4)


-- 删除操作
print("\r删除操作:")
print("删除最后一个元素:", list1:remove(-1))
print("删除中间元素:", list1:remove(list1:length() / 2))
print("删除第一个元素:", list1:remove(1))
print(table.concat(list1, ", "))
print("长度:" .. list1:length(), "\r是否为空: " .. tostring(list1:isEmpty()))

 

测试4:

-- 导入模块
require "List"

-- 创建列表
list1 = List:new(1, 2, 3, 4)


-- 获取子列表操作
print("\r获取子列表操作:")
print("下标1开始:", list1:sub(1))
print("下标1 ~ -1:", list1:sub(1, -1))
print("下标1 ~ len / 2:", list1:sub(1, list1:length() / 2))
print("下标-1 ~ -1:", list1:sub(-1, -1))
print("下标-3 ~ -1:", list1:sub(-3, -1))
print("下标-2开始:", list1:sub(-2))

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值