目录

  1. 什么是 Lua 数组
  2. 为什么要使用数组
  3. Lua 数组的定义与特性
  4. 代码示例
  1. 数组常用函数
  2. 工作原理详解
  3. 优点与应用场景
  4. 常见问题与注意事项
  5. 参考资料与出站链接

什么是 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. 索引从 1 开始
  • 与 C 等语言的 0 起点不同。
  1. 长度计算局限
  • # 只对连续索引有效,稀疏数组需谨慎。
   local t = {1, 2, nil, 4}
   print(#t)  -- 2(遇到 nil 停止)
  1. 性能优化
  • 大量插入删除时考虑预分配空间。
  1. 多维数组嵌套
  • 每行长度可不同,需单独检查。

参考资料与出站链接

  1. 官方文档
  1. 学习资源
  1. 工具支持

如果您需要更复杂的数组示例(如稀疏数组处理或排序),请告诉我,我会进一步扩展!