回顾上节课,先来两个问题
print("12" + 34 .. "56") -- "4656"
三目运算符:
a and b or c(b不能为假)
– 交换第一个和最后一个元素
tb[1], tb[5] = tb[5], tb[1]
1.表的构造式:{}
2.列表风格:数组
1.元素的访问:表名[下标],下标从1开始
2.求长度#:1.如果下标为1的元素为nil,则长度为0
3.记录风格:键值对(哈希表)
1.初始化:{键名 = 值}
2.元素的访问:1.表名["键"] 2.表名.键(推荐)
4.混合风格:列表和记录风格的混合
1.求长度#:只能求数组部分长度
特点:
1.长度可变,类型可以不相同的结构
2.没有初始化或者赋值的元素默认为nil
3.table底层实现就是数组和哈希表
4.表是一种引用类型,一个表用另一个表赋值,表示指向同一张表
5.Lua内存回收机制是通过GC(垃圾回收机制(标记清除法))进行回收
for 变量1,变量2 in 表达式1,表达式2,表达式3 do
循环体
end
ipairs和pairs都会返回三个值,对应泛型for的三个表达式
区别:
1.ipairs遇到元素值为nil则停止循环,pairs遇到nil继续循环;
2.ipairs只能遍历table的数组部分,pairs可以遍历数组和键值对部分(顺序不一定与 书写的顺序一致);
1.insert:插入元素(后面的元素往后移)
参数:1.表 2.下标位置(可不传,默认为最后一个)3.值
2.remove:移除元素 (后面的元素往前移)
参数:1.表 2.下标位置(可不传,默认为最后一个)
返回值:删除元素的值
示例:
local tb = { 1, 2, 3 }
table.insert(tb, 2, 4) -- 在下标为2的位置插入元素4
table.remove(tb, 1) -- 删除下标为1的元素
for i, v in ipairs(tb) do
print(v)
end
删除tb中的所有偶数
1:从前往后删
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
2:从后往前删
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
示例:
local tb = { 1, 2, 3, 4, 5 } -- 初始化
tb = { 6, 7, 8, 9, 10 } -- 重新创建表
tb[6] = 11-- 添加元素
tb[8] = 13
print(tb[7]) -- nil
print(#tb) -- 8
local tb1 = {[1] = 0, [2] = 22, [3] = 33, [5] = 66 }
-- tb1[0] = -11
二维数组
local tb2 = { { 1, 2, 3 }, { 4, 5, 6 } }
print(tb2[2][3]) -- 6
local size = { w = 100, h = 200 }
print(size["w"])
print(size.w)
size.l = 1-- 添加元素
size.getArea = function() -- 给size添加求面积的方法
return size.w * size.h
end
function size.getArea()
return size.w * size.h
end
print(size.getArea())
local tb = { "x", "z", x = 1, y = 2, z = 3 }
print(#tb) -- 2
print(tb[tb.x]) -- "x"
print(tb[tb[tb.x]]) -- 1
print(tb[3]) -- nil
local tb = { 11, 22, 33, 44, 55, x = 1, y = 2 }
tb[7] = 77
local tbCopy = {}
遍历列表风格
for i = 1, #tb do
print(tb[i])
end
1.ipairs
for i, v in ipairs(tb) do
print(i, v) -- 下标,值
end
2.pairs
for k, v in pairs(tb) do
--print(k, v) -- 键,值
tbCopy[k] = v -- 用值给对应的键赋值
end
for k, v in pairs(tbCopy) do
print(k, v)
end
示例:
local tb = { 1, { x = 2 }, "hello" }
print(#tb) -- 3
print(tb[2]) -- table地址
print(#tb[2]) -- 0
local tb = { 1, "x", x = { 1, 2, y = 2 } }
print(#tb) -- 2
print(tb[3]) -- nil
print(#tb[tb[2]]) -- 2
print(tb["x"]["y"]) -- 访问y
print(tb.x.y) -- 访问y
print(tb.x[2])-- 访问x中的2值
local tb = { 1, 2 }
local tb2 = tb -- 指向同一张表
tb2[1] = 11
print(tb[1]) -- 11
实现计数器:
local tb = { 1, 2, 2, 1, 4, 5, 6, 7, 4, 8, 10, 10, 1, 2 }
local counter = {}
counter.size = #tb -- 添加size键值
-- 初始化数量为0
for i = 1, 10 do
counter[i] = 0
end
for i = 1, #tb do
local value = tb[i]
counter[value] = counter[value] + 1
end
遍历table中的所有方法
for k, v in pairs(table) do
print(k, v)
end
习题、
1.table的随机打乱--
2.定义一个牌的表,分成3份(17),cards剩余底牌--
3.table的函 数:concat/sort(参数/返回值/例子)