Lua 数组

关键要点

  • 研究表明,Lua 的数组是基于 table 实现的特殊数据结构,索引默认从 1 开始,适合存储有序数据。
  • 证据显示,数组通过 table 的整数键访问,支持动态扩容,常用 # 获取长度,ipairs 遍历元素。
  • 看起来很可能是通过 table 库函数(如 table.inserttable.remove)操作数组,结合 local 变量优化性能。

Lua 数组简介

概述

在 Lua 中,数组(array)是使用 table 数据结构实现的特殊形式,用于存储有序的元素序列。Lua 的数组索引默认从 1 开始(而非 0),支持动态添加或删除元素,操作灵活。数组通过整数键访问,结合 table 库函数和循环实现高效的数据管理。本文详细讲解 Lua 数组的定义、操作、遍历、示例及注意事项,特别适合中文用户学习。

数组特性

  • 实现:基于 table,使用连续整数键存储元素。
  • 索引:默认从 1 开始,可自定义。
  • 长度:使用 # 运算符获取连续整数索引的元素数。
  • 操作:通过 table.inserttable.remove 等函数增删元素。
  • 遍历:使用 ipairs 循环或数值型 for 循环遍历。
  • 动态性:支持动态扩容和收缩,无需预定义大小。

参考资源


详细调研报告

本文为用户提供关于 Lua 数组的全面中文讲解,涵盖数组定义、基本操作、遍历、表库函数、示例及注意事项,基于可靠的在线资源和官方文档。

Lua 数组概述

Lua 的数组是 table 的子集,使用连续整数键(通常从 1 开始)存储有序数据。研究表明,Lua 数组通过 table 的灵活性实现动态管理,结合 table 库函数和循环提供高效操作。以下是详细分析:

  • 数组定义
  • 数组是 table 的特殊形式,元素以连续整数键存储。
  • 语法
    lua local arr = {元素1, 元素2, 元素3}
  • 示例
    lua local fruits = {"apple", "banana", "orange"} print(fruits[1]) -- 输出:apple print(type(fruits)) -- 输出:table print(#fruits) -- 输出:3(数组长度)
  • 注意
    • 索引从 1 开始,与 C/C++ 等语言不同。
    • 数组是 table,可混用非整数键,但影响 # 的行为。
  • 基本操作
  • 访问元素:通过整数索引访问,如 arr[1]
    lua local arr = {10, 20, 30} print(arr[2]) -- 输出:20
  • 修改元素:直接赋值修改。
    lua arr[2] = 25 print(arr[2]) -- 输出:25
  • 添加元素
    • 直接赋值到新索引:
      lua arr[4] = 40 print(#arr) -- 输出:4
    • 使用 table.insert
      lua table.insert(arr, 50) -- 添加到末尾 print(arr[5]) -- 输出:50
  • 删除元素
    • 赋值为 nil(可能导致非连续索引):
      lua arr[2] = nil print(arr[2]) -- 输出:nil
    • 使用 table.remove
      lua table.remove(arr, 1) -- 删除索引 1 的元素,后续元素前移 print(arr[1]) -- 输出:25(原 arr[2])
  • 长度:使用 # 获取连续整数索引的元素数。 local arr = {1, 2, 3} print(#arr) -- 输出:3 arr[5] = 5 -- 非连续索引 print(#arr) -- 输出:3(# 只计数连续部分)
  • 遍历数组
  • 数值型 for 循环
    lua local arr = {"a", "b", "c"} for i = 1, #arr do print("索引: " .. i .. ", 值: " .. arr[i]) end
    输出:
    索引: 1, 值: a 索引: 2, 值: b 索引: 3, 值: c
  • 泛型 for 循环(ipairs)
    lua for i, v in ipairs(arr) do print("索引: " .. i .. ", 值: " .. v) end
    输出:同上
  • 注意
    • ipairs 遍历从 1 开始的连续整数索引,遇到 nil 停止。
    • pairs 可遍历所有键值对,但不保证顺序,不推荐用于数组。
  • 表库函数
  • Lua 的 table 库提供数组操作函数,常用包括:
    • table.insert(t, [pos,] value):在指定位置插入元素,省略 pos 则追加到末尾。
    • table.remove(t, [pos]):删除指定位置元素,省略 pos 则删除最后一个。
    • table.concat(t, [sep, [i, j]]):连接数组元素为字符串,指定分隔符和范围。
    • table.sort(t, [comp]):对数组排序,可指定比较函数。
  • 示例local arr = {10, 30, 20} table.insert(arr, 2, 15) -- 在索引 2 插入 15 print(table.concat(arr, ", ")) -- 输出:10, 15, 30, 20 table.sort(arr) -- 排序 print(table.concat(arr, ", ")) -- 输出:10, 15, 20, 30 table.remove(arr, 1) -- 删除索引 1 print(table.concat(arr, ", ")) -- 输出:15, 20, 30
  • 多维数组
  • 多维数组通过嵌套表实现。
  • 示例
    lua local matrix = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} } print(matrix[2][3]) -- 输出:6(第 2 行第 3 列)
  • 遍历
    lua for i, row in ipairs(matrix) do for j, val in ipairs(row) do print("行: " .. i .. ", 列: " .. j .. ", 值: " .. val) end end
    输出:
    行: 1, 列: 1, 值: 1 行: 1, 列: 2, 值: 2 行: 1, 列: 3, 值: 3 行: 2, 列: 1, 值: 4 行: 2, 列: 2, 值: 5 行: 2, 列: 3, 值: 6 行: 3, 列: 1, 值: 7 行: 3, 列: 2, 值: 8 行: 3, 列: 3, 值: 9

实际应用示例

以下是一个综合示例,展示数组的定义、操作和遍历:

-- 示例:学生成绩管理
local students = {
    {name = "张伟", grades = {85, 90, 88}},
    {name = "李娜", grades = {92, 95, 90}},
    {name = "王芳", grades = {78, 80, 85}}
}

-- 添加成绩
table.insert(students[1].grades, 87)  -- 张伟添加成绩

-- 计算平均分
local function average(grades)
    local sum = 0
    for _, v in ipairs(grades) do
        sum = sum + v
    end
    return sum / #grades
end

-- 遍历学生和成绩
for i, student in ipairs(students) do
    print("学生: " .. student.name)
    print("成绩: " .. table.concat(student.grades, ", "))
    print("平均分: " .. average(student.grades))
    -- 排序成绩
    table.sort(student.grades)
    print("排序后成绩: " .. table.concat(student.grades, ", "))
end
-- 示例:学生成绩管理
local students = {
    {name = "张伟", grades = {85, 90, 88}},
    {name = "李娜", grades = {92, 95, 90}},
    {name = "王芳", grades = {78, 80, 85}}
}

-- 添加成绩
table.insert(students[1].grades, 87)  -- 张伟添加成绩

-- 计算平均分
local function average(grades)
    local sum = 0
    for _, v in ipairs(grades) do
        sum = sum + v
    end
    return sum / #grades
end

-- 遍历学生和成绩
for i, student in ipairs(students) do
    print("学生: " .. student.name)
    print("成绩: " .. table.concat(student.grades, ", "))
    print("平均分: " .. average(student.grades))
    -- 排序成绩
    table.sort(student.grades)
    print("排序后成绩: " .. table.concat(student.grades, ", "))
end

输出:

学生: 张伟
成绩: 85, 90, 88, 87
平均分: 87.5
排序后成绩: 85, 87, 88, 90
学生: 李娜
成绩: 92, 95, 90
平均分: 92.333333333333
排序后成绩: 90, 92, 95
学生: 王芳
成绩: 78, 80, 85
平均分: 81
排序后成绩: 78, 80, 85

注意事项

  • 索引从 1 开始:Lua 数组索引默认从 1 开始,非 0,与其他语言不同。
  • 长度(#:只计算连续整数索引部分,遇到 nil 停止。
  local arr = {1, 2, nil, 4}
  print(#arr)  -- 输出:2
  • 非连续索引:添加非连续索引(如 arr[10] = 10)不影响 #,但可能导致遍历问题。
  • 引用类型:数组是 table,赋值时共享引用,需深拷贝处理。
  local a = {1, 2}
  local b = a
  b[1] = 10
  print(a[1])  -- 输出:10
  • 性能:频繁插入/删除操作可能影响性能,建议批量操作。
  • 编码:中文字符串需保存为 UTF-8 编码,避免乱码。

推荐资源

这些资源基于当前可访问的在线内容,截至 2025 年 8 月 2 日有效。

结论

Lua 的数组基于 table 实现,索引从 1 开始,支持动态操作和高效遍历。推荐使用 table 库函数(如 table.inserttable.sort)和 ipairs 循环管理数组,结合 local 变量优化性能。用户可通过示例练习掌握数组操作,结合 IDE(如 ZeroBrane Studio)提高开发效率。

表格总结

功能描述示例
定义使用 {} 创建local arr = {1, 2, 3}
访问通过整数索引arr[1]
修改直接赋值arr[1] = 10
长度使用 #print(#arr)
插入table.insert(t, [pos,] value)table.insert(arr, 10)
删除table.remove(t, [pos])table.remove(arr, 1)
排序table.sort(t, [comp])table.sort(arr)
遍历ipairs 或数值型 forfor i, v in ipairs(arr) do print(v) end

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注