Lua学习笔记-table
Posted Initial_Dream
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Lua学习笔记-table相关的知识,希望对你有一定的参考价值。
本来打算3天将lua学完,无奈lua语法实在有点难记,所以还是好记性不如烂笔头,记录一下学习内容。
首先介绍一下lua的table,这是一个key-value型映射,可以动态增长。功能十分强大,并且lua只提供这一种容器。这也是为啥经常忘记的原因,因为仔细学起来有很多东西需要思考。对于有C或者C++基础的,可以看一下源码,这里有一篇博客写的很好lua数据结构之table的内部实现
1. table之数组
这里的数组就是最简单的用整数来索引的,不过下标从1开始
1 table={1,2,3,4} 2 3 for i,v in ipairs(table) do 4 print(i,v) 5 end
2.table之映射
这里的键和值可以是任意的类型,包括函数,因为在lua中函数也是第一类值
function func() print("this is a function") end table={1,2,3,4,[5]=5,n=4,abc=‘abc‘} --声明一个表,前面使用默认数值key,后面显式声明key-value table["a"]="a" --键为字符串,值也为字符串 table.b="b" --字符串键可以通过.快速访问 table[-1]=-1 --键为负数 table[func]=func --键值都为函数 table[50]=50 --键为50 table[-2]={1,2,3} --值为table print(‘key‘,‘\t‘,‘type‘,‘\t‘,‘value‘,‘\t‘,‘type‘) for i,v in pairs(table) do print(i,‘\t‘,type(i),‘\t‘,v,‘\t‘,type(v)) end 输出结果 key type value type 1 number 1 number 2 number 2 number 3 number 3 number 4 number 4 number 5 number 5 number a string a string -2 number table: 0073B4A0 table 50 number 50 number b string b string function: 0073BD40 function function: 0073BD40 function abc string abc string -1 number -1 number n string 4 number
3.table遍历
首先说明一点,一般情况下,整数类型的键都是放在数组里的,但是有2种特殊情况会被分配到hash表里。
对于存放在数组有一个规则,每插入一个整数key时,都要判断包含当前key的区间[1, 2^n]里,是否满足table里所有整数类型key的数量大于2^(n - 1),如果不成立则需要把这个key放在hash表里。这样设计,可以减少空间上的浪费,并可以进行空间的动态扩展。
(1) 使用#获取table大小,这里只是数组部分的大小,也就是索引从1开始的整数,负数存在哈希表里面,过大的整数由于上面原因也在哈希表里,所以上面的例子数组大小为5,不会出现50这个键。
(2) 使用ipairs,这个是获取数组部分的迭代器,与(1)类似,也只是遍历数组部分
(3)使用pairs,获取整个table的迭代器
由于table.maxn已经于5.2版本取消,所以不介绍
for i=1,#(table) do print(i,table[i]) end for i,v in ipairs(table) do print(i,v) end for i,v in pairs(table) do print(i,v) end
4. table常用函数
table.concat(table, sep, start, end)
连接表的数组部分,从start开始,end结束,用sep分开
t={1,2,3,[50]=50,a=1} print(table.concat(t,‘,‘,1,3)) 输出结果 1,2,3
table.insert(table, pos, value)
在pos位置插入value,pos可以是任意整数
t={1,2,3,[50]=50,a=1} table.insert(t,51,51) table.insert(t,-1,-1) for i,v in pairs(t) do print(i,v) end 输出结果 2 1 3 2 4 3 a 1 51 51 50 50 -1 -1
table.remove(table, pos)
删除pos位置的值,并返回pos-1位置的值
t={1,2,3,[50]=50,a=1} print(table.remove(t,3)) 输出结果 2 nil
table.sort(table, comp)
根据comp函数对table进行排序,默认情况下只对数组从1开始的连续部分按照value升序排
t={5,1,2,4,-2,-2,3,[-1]=-1,[51]=0,[50]=50,a=1} table.sort(t) for i,v in pairs(t) do print(i,v) end 输出结果 1 -2 2 -2 3 1 4 2 5 3 6 4 7 5 a 1 51 0 -1 -1 50 50
自定义comp函数
function comp(a,b) return a>b end t={1,2,3,4,[6]=6} table.sort(t,comp) for i,v in pairs(t) do print(i,v) end 输出结果 1 4 2 3 3 2 4 1 6 6
table.foreachi(table, function(i, v))
对table数组中从 1开始的连续整数范围,进行function
类似
for i,v in ipairs(table) do function(i,v) end
table.foreach(table, function(i, v))
对table所有键值对进行function
类似
for i,v in pairs(table) do function(i,v) end
table.getn(table)
返回table的数组元素个数
以上是关于Lua学习笔记-table的主要内容,如果未能解决你的问题,请参考以下文章