元素码农
基础
UML建模
数据结构
算法
设计模式
网络
TCP/IP协议
HTTPS安全机制
WebSocket实时通信
数据库
sqlite
postgresql
clickhouse
后端
rust
go
java
php
mysql
redis
mongodb
etcd
nats
zincsearch
前端
浏览器
javascript
typescript
vue3
react
游戏
unity
unreal
C++
C#
Lua
App
android
ios
flutter
react-native
安全
Web安全
测试
软件测试
自动化测试 - Playwright
人工智能
Python
langChain
langGraph
运维
linux
docker
工具
git
svn
🌞
🌙
目录
▶
Lua语言基础
▶
环境搭建
安装Lua解释器
配置开发环境
第一个Lua程序
▶
基本语法
变量与数据类型
运算符与表达式
控制结构
▶
数据结构
表(Table)详解
数组与迭代
字符串处理
▶
Lua高级编程
▶
函数编程
函数定义与调用
闭包与作用域
高阶函数应用
▶
元表与元方法
元表基础
操作符重载
继承与对象系统
▶
协程编程
协程基础
生产者-消费者模式
协程调度实践
▶
Lua应用实践
▶
游戏开发
Lua与游戏引擎集成
AI脚本实现
热更新机制
▶
系统编程
Lua与C交互
扩展库开发
性能优化技巧
▶
实用工具开发
配置文件解析
自动化测试框架
网络编程基础
发布时间:
2025-03-24 12:03
↑
☰
# Lua数组与迭代 本文将介绍如何在Lua中使用表来实现数组,以及如何使用各种迭代方法来处理数组数据。 ## 数组基础 在Lua中,数组实际上是以整数为索引的表。Lua的数组索引默认从1开始: ### 1. 创建数组 ```lua -- 创建并初始化数组 local arr1 = {10, 20, 30, 40, 50} -- 创建空数组 local arr2 = {} -- 使用整数索引创建稀疏数组 local sparse = { [1] = "first", [3] = "third", [5] = "fifth" } ``` ### 2. 访问数组元素 ```lua -- 使用索引访问 local first = arr1[1] -- 获取第一个元素 local last = arr1[#arr1] -- 获取最后一个元素 -- 修改元素 arr1[1] = 100 -- 修改第一个元素 -- 添加新元素 arr2[1] = "one" -- 添加到空数组 arr2[2] = "two" ``` ### 3. 数组长度 ```lua -- 使用#操作符获取长度 local len1 = #arr1 print("数组长度:" .. len1) -- 注意:稀疏数组的长度可能不准确 local len2 = #sparse print("稀疏数组长度:" .. len2) -- 可能不是你期望的值 -- 获取实际元素数量 local count = 0 for _ in pairs(sparse) do count = count + 1 end print("实际元素数量:" .. count) ``` ## 数组操作 ### 1. 插入和删除 ```lua -- 在数组末尾插入元素 local numbers = {1, 2, 3} table.insert(numbers, 4) -- {1, 2, 3, 4} -- 在指定位置插入元素 table.insert(numbers, 2, 10) -- {1, 10, 2, 3, 4} -- 删除末尾元素 local last = table.remove(numbers) -- 返回4,数组变为{1, 10, 2, 3} -- 删除指定位置的元素 local removed = table.remove(numbers, 2) -- 删除第2个元素(10) ``` ### 2. 数组拼接 ```lua -- 使用table.concat拼接数组元素 local fruits = {"apple", "banana", "orange"} local str1 = table.concat(fruits) -- "applebananaorange" local str2 = table.concat(fruits, ", ") -- "apple, banana, orange" ``` ### 3. 数组排序 ```lua -- 默认排序(升序) local nums = {3, 1, 4, 1, 5, 9, 2, 6} table.sort(nums) -- 自定义排序 local function compare(a, b) return a > b -- 降序排序 end table.sort(nums, compare) -- 对字符串数组排序 local words = {"banana", "apple", "orange"} table.sort(words) -- 按字母顺序排序 ``` ## 迭代方法 ### 1. 使用ipairs(推荐用于数组) ```lua -- ipairs用于连续的整数索引 local arr = {10, 20, 30, 40} for i, v in ipairs(arr) do print(i .. ": " .. v) end ``` ### 2. 使用pairs(用于所有表) ```lua -- pairs可以遍历所有键值对 local mixed = {10, 20, name = "array", ["key"] = "value"} for k, v in pairs(mixed) do print(k .. " = " .. tostring(v)) end ``` ### 3. 使用数值for循环 ```lua -- 使用已知范围遍历 local arr = {10, 20, 30, 40, 50} for i = 1, #arr do print(arr[i]) end -- 使用步长遍历 for i = 1, #arr, 2 do -- 每次跳过一个元素 print(arr[i]) end ``` ## 多维数组 ### 1. 创建二维数组 ```lua -- 创建3x3的二维数组 local matrix = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} } -- 动态创建二维数组 local function create2DArray(rows, cols) local arr = {} for i = 1, rows do arr[i] = {} for j = 1, cols do arr[i][j] = 0 -- 初始化为0 end end return arr end local grid = create2DArray(3, 4) ``` ### 2. 访问和修改二维数组 ```lua -- 访问元素 print(matrix[1][1]) -- 输出:1 -- 修改元素 matrix[2][2] = 10 -- 遍历二维数组 for i = 1, #matrix do for j = 1, #matrix[i] do print(string.format("[%d][%d] = %d", i, j, matrix[i][j])) end end ``` ### 3. 数组操作示例 ```lua -- 矩阵转置 local function transpose(matrix) local rows = #matrix local cols = #matrix[1] local result = create2DArray(cols, rows) for i = 1, rows do for j = 1, cols do result[j][i] = matrix[i][j] end end return result end -- 矩阵相加 local function addMatrix(m1, m2) local rows = #m1 local cols = #m1[1] local result = create2DArray(rows, cols) for i = 1, rows do for j = 1, cols do result[i][j] = m1[i][j] + m2[i][j] end end return result end ``` ## 常见问题解答 ### Q1: 为什么Lua的数组索引从1开始? 这是Lua的设计选择,主要考虑: - 与数学习惯一致 - 与字符串索引保持一致 - 在某些应用场景下更自然 ### Q2: ipairs和pairs的区别是什么? - `ipairs`: - 只遍历数组部分(连续的整数索引) - 从索引1开始,遇到nil就停止 - 适合遍历普通数组 - `pairs`: - 遍历表中的所有键值对 - 包括非整数键和不连续的索引 - 适合遍历关联数组或混合表 ### Q3: 如何高效地处理大型数组? ```lua -- 预分配空间 local largeArray = table.create(1000) -- 如果支持的话 -- 使用table.insert代替直接索引赋值 for i = 1, 1000 do table.insert(largeArray, i) end -- 使用局部变量缓存长度 local len = #largeArray for i = 1, len do -- 处理数组元素 end ``` ## 下一步 现在你已经掌握了Lua的数组和迭代操作,可以继续学习[字符串处理](/article/lua/basic/strings)来了解如何处理文本数据。 ## 参考资源 - [Lua 5.4 参考手册](http://www.lua.org/manual/5.4/manual.html#6.6) - [Programming in Lua](http://www.lua.org/pil/11.html) - [Lua Users Wiki](http://lua-users.org/wiki/TablesTutorial)