表的构造式:{}
列表风格:数组
- 元素的访问:表名[下标],下标从1开始
- 求长度#:
- 特点:
- 长度可变,类型可以不相同的结构
- 没有初始化或者赋值的元素默认为nil
- table底层实现就是数组和哈希表
- 表示一种引用类型,一个表用另一个表赋值,表示指向同一张表
- Lua的内存回收机制是通过GC(垃圾回收机制(标记清除法))进行回收
local tb = {1, 2, 3, 4, 5}
tb = {6, 7, 8, 9, 10}
tb[6] = 11
tb[8] = 13
print(tb[7])
print(#tb)
local tb1 = {[1] = 0, [2] =22, [3] = 33, [5] = 66}
print(#tb1)
local tb2 = {{1, 2, 3}, {4, 5, 6}}
print(tb2[2][3])
记录风格:键值对(哈希表)
local size = {w = 100, h = 200}
print(size.w, size.h)
size.l = 1
print(size.l)
size.getArea = function()
return size.w * size.h
end
size.getC = function()
return (size.w + size.h) * 2
end
function size.getC()
return (size.w + size.h) * 2
end
print(size.getC())
混合风格:列表和记录风格的混合
local tb3 = {"x", "y", x = 1, y = 2, z = 3}
print(#tb3)
print(tb3[tb3.x])
print(tb3[tb3[tb3.x]])
print(tb3[3])
print("-------------")
local tb = {1, 2, 3, 4, 5}
for i = 1,#tb do
print(tb[i])
end
遍历记录风格-->泛型for
泛型for:
ipairs和pairs都会返回三个值,对应泛型for的三个表达式
- 区别:
- ipairs遇到元素值为nil则停止循环,pairs遇到nil继续循环
- ipairs只能遍历table的数组部分,pairs可以变量数组和键值对部分(顺序不一定和书写的顺序一致)
实现table的拷贝
local tb4 = {"x", "y", nil, x = 1, y = 2, z = 3, "z"}
local tbCopy = {}
for k,v in ipairs(tb4) do
print(k, v)
end
print("-------------")
for k,v in pairs(tb4) do
tbCopy[k] = v
print(k, v)
end
print("-------------")
for k,v in pairs(tbCopy) do
print(k, v)
end
例题
local tb = {1, {x = 2}, "hello"}
print(#tb)
print(tb[2])
print(#tb[2])
local tb = {1,"x",x = {1, 2, y = 2}}
print(#tb)
print(tb[3])
print(#tb[tb[2]])
print(tb["x"]["y"])
print(tb.x.y)
print(tb.x[2])
local tb = {1, 2}
local tb2 = tb
tb2[1] = 11
print(tb[1])
local tb = {1, 2, 2, 1, 4, 5, 6, 7, 4, 8, 10, 10, 1, 2}
local counter = {}
counter.size = #tb
for i = 1, 10 do
counter[i] = 0
end
for i = 1, #tb do
counter[tb[i]] = counter[tb[i]] + 1
end
print("----------------")
for k,v in ipairs(counter) do
print(k, v)
end
print("----------------")
table函数
insert:插入元素(后面的元素往后移)
- 参数:1.表 2.下标位置(可不传,默认为最后一个) 3.值
- 返回值:没有返回值
local tb = {1, 2, 3}
table.insert(tb, 4)
remove:移出元素(后面的元素往前移)
- 参数:1.表 2.下标位置(可不传,默认为最后一个)
- 返回值:删除元素的值
print(table.remove(tb))
遍历table中的所有方法
for k,v in pairs(table) do
print(k, v)
end
例题
local tb = {1, 2, 2, 3, 4, 4}
local i = 1
while i <= #tb do
if tb[i] %2 == 0 then
table.remove(tb, i)
else
i = i + 1
end
end
for i = #tb,1,-1 do
if tb[i] % 2 == 0 then
table.remove(tb, i)
end
end
for i = 1,#tb do
print(tb[i])
end