On this page

Lua 数组

Lua 数组详解

在 Lua 中,数组是通过 table 实现的特殊数据结构。以下是关于 Lua 数组的全面介绍:

1. 数组基本概念

Lua 中的数组实际上是使用整数作为键的 table,具有以下特点:

  • 索引通常从 1 开始(Lua 惯例)
  • 可以动态增长和缩小
  • 可以包含不同类型的元素
  • 长度不固定

2. 创建数组

直接初始化

-- 创建包含5个元素的数组
local numbers = {10, 20, 30, 40, 50}

-- 混合类型数组
local mixed = {1, "two", 3.0, true, nil}

先创建后赋值

local colors = {}
colors[1] = "red"
colors[2] = "green"
colors[3] = "blue"

3. 访问数组元素

local fruits = {"apple", "banana", "orange"}

-- 访问元素(索引从1开始)
print(fruits[1])  -- 输出: apple
print(fruits[2])  -- 输出: banana

-- 修改元素
fruits[3] = "grape"

4. 数组遍历

使用 ipairs

for index, value in ipairs(fruits) do
    print(index, value)
end
-- 输出:
-- 1    apple
-- 2    banana
-- 3    orange

使用数值 for 循环

for i = 1, #fruits do
    print(i, fruits[i])
end

5. 数组长度

使用 # 运算符获取数组长度:

print(#fruits)  -- 输出: 3

注意:# 只计算连续数字索引部分,遇到 nil 会停止计数:

local arr = {1, 2, nil, 4}
print(#arr)  -- 输出: 2(因为遇到nil停止计数)

6. 数组常用操作

添加元素

table.insert(fruits, "pear")  -- 添加到末尾
table.insert(fruits, 2, "kiwi")  -- 插入到位置2

删除元素

table.remove(fruits)  -- 删除最后一个元素
table.remove(fruits, 2)  -- 删除位置2的元素

查找元素

function contains(arr, value)
    for _, v in ipairs(arr) do
        if v == value then
            return true
        end
    end
    return false
end

print(contains(fruits, "apple"))  -- 输出: true

数组排序

local nums = {3, 1, 4, 1, 5, 9}
table.sort(nums)  -- 升序排序
table.sort(nums, function(a, b) return a > b end)  -- 降序排序

7. 多维数组

Lua 可以通过 table 嵌套实现多维数组:

-- 创建3x3矩阵
local matrix = {
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9}
}

-- 访问元素
print(matrix[2][3])  -- 输出: 6

-- 遍历二维数组
for i = 1, #matrix do
    for j = 1, #matrix[i] do
        io.write(matrix[i][j] .. " ")
    end
    print()
end

8. 数组与 table 的关系

Lua 数组实际上是 table 的特殊用法:

local arr = {"a", "b", "c"}
print(type(arr))  -- 输出: table

-- 可以混合使用数组和字典特性
arr["name"] = "myArray"
print(arr.name)   -- 输出: myArray
print(arr[1])     -- 输出: a

9. 性能注意事项

  1. 预分配大数组可以提高性能:

    local bigArr = {}
    for i = 1, 10000 do
        bigArr[i] = 0  -- 预先分配空间
    end
    
  2. 避免在数组中间频繁插入/删除,因为需要移动后续元素

  3. 大量数据拼接时使用 table.concat.. 更高效:

    local parts = {"a", "b", "c"}
    local result = table.concat(parts, ",")  -- 输出: "a,b,c"
    

10. 常用数组模式

栈实现

local stack = {}

-- 压栈
table.insert(stack, "item1")

-- 弹栈
local item = table.remove(stack)

队列实现

local queue = {}

-- 入队
table.insert(queue, "item1")

-- 出队
local item = table.remove(queue, 1)

Lua 数组虽然基于 table 实现,但提供了强大的数据组织能力。理解这些特性可以帮助你更有效地处理有序数据集合。