Skip to content

数组

在 Lua 中,数组是通过表(table)来实现的。本章节将介绍 Lua 中数组的定义、访问、修改和相关操作。

数组定义

在 Lua 中,数组可以通过表来定义,索引从 1 开始:

lua
-- 定义一个数组
local fruits = {"苹果", "香蕉", "橙子", "葡萄"}

-- 访问数组元素
print(fruits[1])  -- 输出 苹果
print(fruits[2])  -- 输出 香蕉
print(fruits[3])  -- 输出 橙子
print(fruits[4])  -- 输出 葡萄

数组长度

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

lua
local fruits = {"苹果", "香蕉", "橙子", "葡萄"}
print(#fruits)  -- 输出 4

数组遍历

使用 ipairs 遍历

lua
local fruits = {"苹果", "香蕉", "橙子", "葡萄"}
for i, fruit in ipairs(fruits) do
  print(i, fruit)
end

输出:

1	苹果
2	香蕉
3	橙子
4	葡萄

使用 for 循环遍历

lua
local fruits = {"苹果", "香蕉", "橙子", "葡萄"}
for i = 1, #fruits do
  print(i, fruits[i])
end

输出:

1	苹果
2	香蕉
3	橙子
4	葡萄

数组修改

修改元素

lua
local fruits = {"苹果", "香蕉", "橙子", "葡萄"}
fruits[2] = "梨"
print(fruits[2])  -- 输出 梨

添加元素

lua
local fruits = {"苹果", "香蕉", "橙子", "葡萄"}
-- 在末尾添加元素
fruits[#fruits + 1] = "梨"
print(fruits[5])  -- 输出 梨

-- 使用 table.insert 添加元素
table.insert(fruits, "桃")
print(fruits[6])  -- 输出 桃

-- 在指定位置插入元素
table.insert(fruits, 2, "草莓")
print(fruits[2])  -- 输出 草莓
print(fruits[3])  -- 输出 香蕉

删除元素

lua
local fruits = {"苹果", "香蕉", "橙子", "葡萄"}
-- 删除末尾元素
fruits[#fruits] = nil
print(#fruits)  -- 输出 3

-- 使用 table.remove 删除元素
table.remove(fruits, 2)
print(fruits[2])  -- 输出 橙子

数组操作

排序

使用 table.sort 函数对数组进行排序:

lua
local numbers = {3, 1, 4, 1, 5, 9, 2, 6}
table.sort(numbers)
for i, num in ipairs(numbers) do
  print(num)
end

输出:

1
1
2
3
4
5
6
9

拼接

使用 table.concat 函数拼接数组元素:

lua
local fruits = {"苹果", "香蕉", "橙子", "葡萄"}
local str = table.concat(fruits, ", ")
print(str)  -- 输出 苹果, 香蕉, 橙子, 葡萄

查找

lua
function find(arr, value)
  for i, v in ipairs(arr) do
    if v == value then
      return i
    end
  end
  return nil
end

local fruits = {"苹果", "香蕉", "橙子", "葡萄"}
print(find(fruits, "香蕉"))  -- 输出 2
print(find(fruits, "梨"))  -- 输出 nil

多维数组

Lua 支持多维数组,通过表的嵌套来实现:

lua
-- 定义一个二维数组
local matrix = {
  {1, 2, 3},
  {4, 5, 6},
  {7, 8, 9}
}

-- 访问二维数组元素
print(matrix[1][1])  -- 输出 1
print(matrix[2][2])  -- 输出 5
print(matrix[3][3])  -- 输出 9

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

输出:

1 2 3 
4 5 6 
7 8 9

稀疏数组

在 Lua 中,数组可以是稀疏的,即索引可以不连续:

lua
local sparseArray = {}
sparseArray[1] = "第一个元素"
sparseArray[100] = "第一百个元素"
sparseArray[1000] = "第一千个元素"

print(sparseArray[1])  -- 输出 第一个元素
print(sparseArray[100])  -- 输出 第一百个元素
print(sparseArray[1000])  -- 输出 第一千个元素
print(#sparseArray)  -- 输出 1,因为 # 只计算连续部分的长度

数组的应用

示例 1:计算数组元素的和

lua
function sum(arr)
  local total = 0
  for i, v in ipairs(arr) do
    total = total + v
  end
  return total
end

local numbers = {1, 2, 3, 4, 5}
print(sum(numbers))  -- 输出 15

示例 2:查找数组中的最大值

lua
function max(arr)
  local maxValue = arr[1]
  for i = 2, #arr do
    if arr[i] > maxValue then
      maxValue = arr[i]
    end
  end
  return maxValue
end

local numbers = {3, 1, 4, 1, 5, 9, 2, 6}
print(max(numbers))  -- 输出 9

示例 3:反转数组

lua
function reverse(arr)
  local reversed = {}
  for i = #arr, 1, -1 do
    table.insert(reversed, arr[i])
  end
  return reversed
end

local numbers = {1, 2, 3, 4, 5}
local reversed = reverse(numbers)
for i, v in ipairs(reversed) do
  print(v)
end

输出:

5
4
3
2
1

示例 4:合并两个数组

lua
function merge(arr1, arr2)
  local merged = {}
  for i, v in ipairs(arr1) do
    table.insert(merged, v)
  end
  for i, v in ipairs(arr2) do
    table.insert(merged, v)
  end
  return merged
end

local arr1 = {1, 2, 3}
local arr2 = {4, 5, 6}
local merged = merge(arr1, arr2)
for i, v in ipairs(merged) do
  print(v)
end

输出:

1
2
3
4
5
6

小结

本章节介绍了 Lua 中数组的定义、访问、修改、遍历和相关操作,包括数组长度、添加元素、删除元素、排序、拼接、查找、多维数组和稀疏数组等内容。掌握这些内容,对于编写 Lua 程序非常重要。