目录
什么是 Lua 数组
Lua 中的“数组”实际上是通过 Lua 的核心数据结构 table
实现的。Lua 没有独立的数组类型,而是用表的数字索引(从 1 开始)来模拟数组行为。数组本质上是表的子集,用于存储有序的元素序列。
为什么要使用数组
- 有序存储:管理连续的数据集合。
- 高效遍历:支持快速迭代访问。
- 动态调整:无需预定义大小。
- 通用性:与其他表功能无缝结合。
Lua 数组的定义与特性
- 定义:用
table
创建,索引从 1 开始。 - 动态性:长度可变,元素可随时添加或删除。
- 类型混合:元素可以是任意 Lua 数据类型。
- 长度:使用
#
获取连续数字索引的元素个数。
代码示例
数组创建与访问
-- 创建数组
local fruits = {"苹果", "香蕉", "橙子"}
-- 访问元素
print("第一个: " .. fruits[1])
print("第二个: " .. fruits[2])
-- 修改元素
fruits[2] = "葡萄"
print("修改后第二个: " .. fruits[2])
-- 获取长度
print("长度: " .. #fruits)
运行结果:
第一个: 苹果
第二个: 香蕉
修改后第二个: 葡萄
长度: 3
数组操作
local numbers = {10, 20, 30}
-- 添加元素
table.insert(numbers, 40)
print("添加后: " .. table.concat(numbers, ", "))
-- 删除元素
table.remove(numbers, 2) -- 删除索引 2 的元素
print("删除后: " .. table.concat(numbers, ", "))
-- 遍历数组
for i = 1, #numbers do
print("元素 " .. i .. ": " .. numbers[i])
end
运行结果:
添加后: 10, 20, 30, 40
删除后: 10, 30, 40
元素 1: 10
元素 2: 30
元素 3: 40
多维数组
-- 创建二维数组
local matrix = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
}
-- 访问元素
print("matrix[2][3]: " .. matrix[2][3]) -- 6
-- 遍历二维数组
for i = 1, #matrix do
for j = 1, #matrix[i] do
io.write(matrix[i][j] .. " ")
end
print() -- 换行
end
运行结果:
matrix[2][3]: 6
1 2 3
4 5 6
7 8 9
数组常用函数
函数 | 描述 | 示例 |
---|---|---|
table.insert(t, value) | 在末尾插入元素 | table.insert(t, 5) |
table.insert(t, pos, value) | 在指定位置插入 | table.insert(t, 2, 5) |
table.remove(t, pos) | 删除指定位置元素 | table.remove(t, 1) |
table.concat(t, sep) | 连接数组元素为字符串 | table.concat({"a", "b"}, ",") → “a,b” |
#t | 获取数组长度 | #{"a", "b"} → 2 |
工作原理详解
- 表实现:数组是表的数字索引部分,键为连续整数。
- 长度计算:
#
返回最大连续数字索引,但遇到nil
停止。 - 内存管理:表动态分配内存,支持扩容和收缩。
优点与应用场景
优点
- 灵活:长度动态调整,元素类型不限。
- 简洁:无需显式声明大小。
- 高效:连续索引访问速度快。
应用场景
- 列表管理:存储游戏物品、玩家数据。
- 矩阵运算:二维数组用于网格计算。
- 数据遍历:处理有序集合。
常见问题与注意事项
- 索引从 1 开始:
- 与 C 等语言的 0 起点不同。
- 长度计算局限:
#
只对连续索引有效,稀疏数组需谨慎。
local t = {1, 2, nil, 4}
print(#t) -- 2(遇到 nil 停止)
- 性能优化:
- 大量插入删除时考虑预分配空间。
- 多维数组嵌套:
- 每行长度可不同,需单独检查。
参考资料与出站链接
- 官方文档:
- 学习资源:
- 菜鸟教程 – Lua 表(中文)
- Lua Users – Tables(英文)
- 工具支持:
- ZeroBrane Studio:调试数组。
如果您需要更复杂的数组示例(如稀疏数组处理或排序),请告诉我,我会进一步扩展!
发表回复