news 2026/10/15 20:33:04

Lua数组

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Lua数组

lua数组和普通的数组不同,需要好好看看,算是lua的重点,没一个小点都有对应的代码实践,建议跟着一起敲一遍这样理解会更好一点。主要就是什么是lua的数组以及关于lua数组的一些基础和常规操作,再就是对常见问题的解决。无他唯手熟尔。

一、什么是Lua数组?

Lua中并没有传统意义上的“数组”类型,数组实际上是通过table(表)实现的特殊数据结构。更准确地说,Lua中的数组是以整数为键的有序table。

-- 这是一个Lua数组 local fruits = {"苹果", "香蕉", "橙子"} print(fruits[1]) -- 输出:苹果

二、Lua数组的核心特性

1. 索引从1开始

local numbers = {10, 20, 30, 40} print(numbers[0]) -- 输出:nil print(numbers[1]) -- 输出:10 print(numbers[2]) -- 输出:20

2. 长度操作符#

local colors = {"红", "绿", "蓝"} print(#colors) -- 输出:3 -- 注意:长度操作符只对连续数组有效 local sparseArray = {[1] = "A", [3] = "C", [5] = "E"} print(#sparseArray) -- 输出可能为5,但行为不一致

三、数组基本操作

1. 创建与初始化

-- 直接初始化 local emptyArray = {} local primes = {2, 3, 5, 7, 11} -- 动态创建 local squares = {} for i = 1, 10 do squares[i] = i * i end

2. 访问与修改

local students = {"Alice", "Bob", "Charlie"} -- 访问 print(students[2]) -- 输出:Bob -- 修改 students[2] = "Bobby" print(students[2]) -- 输出:Bobby -- 添加元素 students[4] = "David" print(#students) -- 输出:4

3. 遍历数组

local scores = {85, 92, 78, 95} -- 方法1:使用数值for循环 for i = 1, #scores do print("学生" .. i .. "分数:" .. scores[i]) end -- 方法2:使用ipairs迭代器(推荐) for index, value in ipairs(scores) do print(index, value) end -- 方法3:通用pairs迭代器 for key, value in pairs(scores) do print(key, value) end

四、数组实用操作

1. 数组拼接

function concatArrays(arr1, arr2) local result = {} for i, v in ipairs(arr1) do result[i] = v end for i, v in ipairs(arr2) do result[#arr1 + i] = v end return result end local arr1 = {1, 2, 3} local arr2 = {4, 5, 6} local combined = concatArrays(arr1, arr2)

2. 数组切片

function sliceArray(arr, startIndex, endIndex) local result = {} for i = startIndex, endIndex do result[#result + 1] = arr[i] end return result end local numbers = {1, 2, 3, 4, 5, 6} local middle = sliceArray(numbers, 2, 4) -- middle = {2, 3, 4}

3. 查找元素

function findIndex(arr, value) for i, v in ipairs(arr) do if v == value then return i end end return nil end local fruits = {"apple", "banana", "orange"} print(findIndex(fruits, "banana")) -- 输出:2

五、多维数组

-- 创建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

六、数组与table的混合使用

-- 混合数据结构 local employee = { name = "张三", age = 28, skills = {"Lua", "Python", "C++"}, -- 数组部分 projects = { -- 多维混合结构 {name = "项目A", role = "开发"}, {name = "项目B", role = "测试"} } } -- 访问混合结构 print(employee.name) -- 输出:张三 print(employee.skills[2]) -- 输出:Python print(employee.projects[1].name) -- 输出:项目A

七、性能优化与最佳实践

1. 避免创建稀疏数组

-- 不推荐:稀疏数组 local badArray = {} badArray[1] = "A" badArray[1000] = "B" -- 中间有大量nil值 -- 推荐:紧凑数组 local goodArray = {} for i = 1, 1000 do goodArray[i] = "default" end goodArray[1000] = "B"

2. 使用table.concat进行字符串拼接

local words = {"Hello", "World", "from", "Lua"} -- 低效方式 local result = "" for i, word in ipairs(words) do result = result .. word .. " " end -- 高效方式 local efficientResult = table.concat(words, " ")

3. 预分配数组大小(如果需要)

local function createLargeArray(size) local arr = {} -- 预分配空间(Lua 5.3+) if math.tointeger then arr = table.new(size, 0) end for i = 1, size do arr[i] = i end return arr end

八、实战示例:学生成绩管理系统

local StudentManager = {} function StudentManager.new() return { students = {}, count = 0 } end function StudentManager:addStudent(name, scores) self.count = self.count + 1 self.students[self.count] = { id = self.count, name = name, scores = scores or {}, average = 0 } self:calculateAverage(self.count) return self.count end function StudentManager:calculateAverage(studentIndex) local student = self.students[studentIndex] if #student.scores > 0 then local total = 0 for _, score in ipairs(student.scores) do total = total + score end student.average = total / #student.scores end end function StudentManager:getTopStudents(limit) -- 创建副本排序 local sorted = {} for i = 1, self.count do sorted[i] = self.students[i] end table.sort(sorted, function(a, b) return a.average > b.average end) return sliceArray(sorted, 1, limit or 5) end -- 使用示例 local manager = StudentManager.new() manager:addStudent("小明", {85, 90, 88}) manager:addStudent("小红", {92, 95, 89}) manager:addStudent("小刚", {78, 82, 80}) local topStudents = manager:getTopStudents(3) for i, student in ipairs(topStudents) do print(string.format("%d. %s: %.2f", i, student.name, student.average)) end

九、常见问题与解决方案

Q1: 数组长度不准确?

-- 问题:数组中有nil值 local problematic = {1, 2, nil, 4} print(#problematic) -- 输出可能是2或4 -- 解决方案:使用自定义长度函数 function safeLength(arr) local count = 0 for _ in ipairs(arr) do count = count + 1 end return count end

Q2: 数组浅拷贝问题?

local original = {{name = "test"}, {name = "demo"}} local copy = {} -- 错误方式:浅拷贝 for i, v in ipairs(original) do copy[i] = v -- 只复制了引用! end -- 正确方式:深拷贝(简化版) function deepCopyArray(arr) local result = {} for i, v in ipairs(arr) do if type(v) == "table" then result[i] = deepCopyArray(v) else result[i] = v end end return result end

总结

Lua数组作为table的特殊应用,具有灵活、易用的特点。关键要点:

  1. Lua数组本质是索引为整数的table

  2. 索引从1开始,使用#获取长度

  3. 推荐使用ipairs进行遍历

  4. 避免稀疏数组以保持性能

  5. 利用table库函数简化操作

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/13 12:25:41

python基于Vue的北京市公交线路管理系统_vi06l_django Flask pycharm项目

目录已开发项目效果实现截图关于博主开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!已开发项目效果实现截图 同行可拿货,招校园代理 ,本人源头供货商 python基于Vue的北京市公交线路管理系…

作者头像 李华
网站建设 2026/10/13 12:26:09

目录结构保留的JAVA文件夹上传实现思路

大文件传输系统解决方案 项目背景与需求分析 作为北京某软件公司项目负责人,我们近期面临一个技术挑战:在产品中集成一个高性能、高稳定性的超大文件传输系统。经过详细需求分析,我们确认以下核心需求: 大文件处理能力&#xf…

作者头像 李华
网站建设 2026/10/16 11:27:53

毕设项目 基于机器视觉的驾驶疲劳检测系统(源码+论文)

文章目录 0 前言1 项目运行效果2 课题背景3 Dlib人脸检测与特征提取3.1 简介3.2 Dlib优点 4 疲劳检测算法4.1 眼睛检测算法4.2 打哈欠检测算法4.3 点头检测算法 5 PyQt55.1 简介5.2相关界面代码 6 最后 0 前言 🔥这两年开始毕业设计和毕业答辩的要求和难度不断提升…

作者头像 李华
网站建设 2026/10/15 4:33:17

Web编辑器复制PPT图片并自动上传服务器组件

企业网站后台管理系统富文本编辑器功能扩展项目记录 一、项目背景与需求分析 作为北京某集团企业项目负责人,近期负责的项目中遇到新需求:在企业网站后台管理系统文章发布模块增加 Word 粘贴和导入功能,支持微信公众号内容粘贴(…

作者头像 李华
网站建设 2026/10/16 12:08:32

《创业之路》-769-CTO如何在如下六个维度进行能力的提升: 技术架构 | 技术战略 | 团队管理 | 商业与产品 | 创新与未来 | 高层思维

要成为一名卓越的 CTO(首席技术官),不能只是“最大的程序员”,而必须是技术、组织、商业与战略的整合者。以下是围绕你提出的六大核心维度,系统化的能力提升路径与具体行动建议:🔧 一、产品与研…

作者头像 李华
网站建设 2026/10/12 16:35:52

无侵入式HyperWorks许可证使用数据采集方案

无侵入式HyperWorks许可证使用数据采集方案:企业如何有效提升性能与降低成本 作为一名IT部门经理,我深知企业在使用HyperWorks这类高性能仿真软件时,常常会面临一个长期存在的痛点:许可证资源有限,影响项目进度与效率…

作者头像 李华