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的数组元素个数

 

posted @ 2017-08-23 18:35  Initial_Dream  阅读(311)  评论(0编辑  收藏  举报