sta ble clas 容器 减少空间 排序 sort 特殊情况
本来打算 3 天将 lua 学完,无奈 lua 语法实在有点难记,所以还是好记性不如烂笔头,记录一下学习内容。
首先介绍一下 lua 的 table,这是一个 key-value 型映射,可以动态增长。功能十分强大,并且 lua 只提供这一种容器。这也是为啥经常忘记的原因,因为仔细学起来有很多东西需要思考。对于有 C 或者 C++ 基础的,可以看一下源码,这里有一篇博客写的很好 lua 数据结构之 table 的内部实现
1. table 之数组
这里的数组就是最简单的用整数来索引的,不过下标从 1 开始
- table={1,2,3,4}
- for i,v in ipairs(table) do
- print(i,v)
- 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
来源: http://www.bubuko.com/infodetail-2275149.html