[Lua] Table知识点学习

差不多将近一个半月没更新博客了…之前一直忙着期末考试复习,没啥额外的学习输出。最近开始实习了,公司里的游戏项目大半都是用Lua写的,之前也没有学过lua语言,所以就对lua的一些知识概念点进行一个复习总结,今天先讲讲table吧。
学习资源均来自网上,看的最多的就是菜鸟教程上的。

一.什么是Table

table 是 Lua 的一种数据结构用来帮助我们创建不同的数据类型,如:数组、字典等。
Lua table 使用关联型数组,你可以用任意类型的值来作数组的索引,但这个值不能是 nil。
Lua table 是不固定大小的,你可以根据自己需要进行扩容。

  • 我们绝大部分在使用lua语言的时候,都会遇到table的各种情况,table作为lua的数据结构可以灵活多变,接下来会介绍一些基本的使用。

二.Table的使用

构造Table最简单的方式就是

-- 初始化table
mytable = { }

-- 指定值
mytable[1] = "Lua"

-- 垃圾回收table
mytable = nil

从最简单的table运用来看,你可以把table当成数组。

mytable = { "C" , "C#" , "Java" , "Lua" }

而调用则是根据学过的许多语言一样,通过索引来进行访问。

print(mytable[0]) -- 结果为nil
print(mytable[1]) -- 结果为 C

细心的朋友会发现到,Lua中的索引是从1开始的。当然你如果想从0开始也可以的,就是麻烦了点

mytable = {[0] = "C" , [1] = "C#" , ...}
print(mytable[0]) -- 结果为 C
print(mytable[1]) -- 结果为 C#

接着再介绍一点Lua中自带的Table操作

  • 1.table.concat(table , sep , start , end): concat是连接的缩写,该函数作用是将table中从索引为start到end的所有元素以sep分隔符进行分割。
    举个例子
mytable = {[0] = "C" , [1] = "C#" , [2] = "Java",...}

print(table.concat(mytable,",",0,2))
-- 输出 C,C#,Java
  • 2.table.insert (table, pos ,value): insert就是插入的意思,该函数就是将table索引为pos的元素前面添加一个value元素,当然这里pos参数可以不写,默认就为table末尾。
mytable = {[0] = "C" , [1] = "C#" , [2] = "Java",...}

table.insert(mytable,3,"Lua")
print(mytable[3])
-- 输出 Lua
-- 这个函数就等于告诉你 mytable [pos] = value
  • 3.table.maxn(table):指定table中所有正数key值中最大的key值. 如果不存在key值为正数的元素, 则返回0。(Lua5.2之后该方法已经不存在了)
    这个函数我用到的不多…就是求table中最大正key值(最大索引)
mytable = {[0] = "C" , [1] = "C#" , [2] = "Java",[5]="PHP"}
print(table.maxn(mytable))
-- 输出 5
  • 4.table.remove(table,pos):
    返回table数组部分位于pos位置的元素. 其后的元素会被前移. pos参数可选, 默认为table长度, 即从最后一个元素删起。
  • 5.table.sort (table,cmp)
    对给定的table进行升序排序。cmp参数可选,可以自定义排序比较函数。
    都说到排序了,那就做个小练习吧,用Lua编个冒泡排序
-- 冒泡排序
function bubble_sort(tab)
	for i = 1 , #tab do           -- #所取的长度是从索引为1开始,直到遇到第一个nil value
		for j = 1 , #tab-1 do
			if( tab[j]>tab[j+1]) then
				tab[j],tab[j+1] = tab[j+1],tab[j] -- 两数交换
			end
		end
	end
end

mytable = { 23, 35, 67, 12, 44, 85 }
bubble_sort(mytable)
for _,v in pairs(mytable) do
	print(v)
end
--[[ 
输出 
12
23
35
44
67
85 
]]--

这里额外说一点的是获取table的长度时,如果是对于普通的数组例如上面的纯数字数组是可以直接通过 # 去获取的,但是#会从索引1开始,并在索引中断的地方停止记数。

mytable = {[0] = "C" , [1] = "C#" , [2] = 152,["3"]="3",[28]=123}
print( #mytable )
-- 输出 2 
--(长度只记录索引1和2 之后索引就不是连续的了。)
print( mytable["3"] )
-- 输出 3
-- (["3"]="3" 是通过键值对的形式来表示的)

上面提到了键值对,这也是Table在lua经常充当字典的原因。

mytable = { ["1"] = "Chinese" , ["2"] = "American" , ["3"] = "Japanese" }
print(mytable ["1"])

由于Lua中对Table中value的数据类型没有限定,所以你可以放任何你能想到的。

-- table和函数挂钩
function fun1()
	return "this is fun1"

end
mytab1= { ["fun1"] = fun1() }
print(mytab1["fun1"])
-- 输出 this is fun1
-- table和table之间挂钩
function fun1()
	return "this is fun1"

end
mytab1= { ["fun1"] = fun1() }

mytab2= { ["tab1"] =mytab1}
print(mytab2["tab1"] ["fun1"])
-- 输出 this is fun1

其实可以把table就想象成一个快递中心(地址),你手机收到的取货号就好比索引或者key键,你的快递就是相应的value值,就是根据你的取货号一一对应的。

三.结尾

table的基础内容差不多也就这些了吧,如果以上内容有问题的可以评论指出啊~刚开始学,希望大家一起努力!两三天之内更新metatable的内容,metatable元表的内容可是需要花很长时间去理解的,所以我会尽量写的时候通俗易懂点,溜了溜了!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值