006 动态数组(lua)

news/2024/7/7 19:32:09 标签: lua, 算法

文章目录

    • 初步准备
    • 实际应用

在Lua中,没有类的概念,因为它是基于原型的语言。不过,我们可以使用表(table)来模拟类和对象
Lua中的数组索引是从1开始的,而不是从0开始,
Lua的表是动态大小的,因此我们没有在Lua实现中强制数组的容量。
我们在Array.new函数中初始化了一个具有指定容量大小的数组,并且当尝试添加超过该容量的元素时,会抛出一个错误。在实际Lua使用中,通常不需要这样做,因为Lua表会自动扩展。此外,我们在移除元素时显式地将最后一个元素设置为nil,以避免潜在的内存泄漏,这是Lua中管理内存的一种好习惯。

初步准备

lua">-- 这里创建了一个空表Array,它将被用作自定义数组类的原型。
-- __index元方法用于当访问表中不存在的字段时,Lua会调用这个元方法来查找值。
Array = {}  
Array.__index = Array  

-- 构造函数
-- 这个函数是Array的构造函数,用于创建一个新的Array实例。
-- setmetatable函数设置了self的元表为Array,这样self就可以访问Array中定义的方法。

function Array.new(capacity)  
    if capacity == nil then  
        capacity = 10  
    end  
    local self = {  
        data = {},  
        size = 0,  
        capacity = capacity  
    }  
    setmetatable(self, Array)  
    for i = 1, capacity do  
        self.data[i] = nil  
    end  
    return self  
end  

-- 成员方法
-- 在Lua中,冒号:语法用于定义对象的方法
-- 这个方法返回数组的大小。self关键字代表调用该方法的对象实例。
function Array:getSize()  
    return self.size  
end  
  
function Array:getCapacity()  
    return self.capacity  
end  
  
function Array:isEmpty()  
    return self.size == 0  
end  
  
function Array:addLast(e)  
    self:add(self.size + 1, e)  
end  
  
function Array:addFirst(e)  
    self:add(1, e)  
end  
  
function Array:add(index, e)  
    if self.size == self.capacity then  
        error("Add failed. Array is full.")  
    end  
  
    if index < 1 or index > self.size + 1 then  
        error("Add failed. Require index >= 1 and index <= size + 1.")  
    end  
  
    for i = self.size, index, -1 do  
        self.data[i + 1] = self.data[i]  
    end  
    self.data[index] = e  
    self.size = self.size + 1  
end  
  
function Array:get(index)  
    if index < 1 or index > self.size then  
        error("Get failed. Index is illegal.")  
    end  
    return self.data[index]  
end  
  
function Array:set(index, e)  
    if index < 1 or index > self.size then  
        error("Set failed. Index is illegal.")  
    end  
    self.data[index] = e  
end  
  
function Array:contains(e)  
    for i = 1, self.size do  
        if self.data[i] == e then  
            return true  
        end  
    end  
    return false  
end  
  
function Array:find(e)  
    for i = 1, self.size do  
        if self.data[i] == e then  
            return i  
        end  
    end  
    return -1  
end  
  
function Array:remove(index)  
    if index < 1 or index > self.size then  
        error("Remove failed. Index is illegal.")  
    end  
  
    local ret = self.data[index]  
    for i = index, self.size - 1 do  
        self.data[i] = self.data[i + 1]  
    end  
    self.size = self.size - 1  
    self.data[self.size + 1] = nil  -- Explicitly nil the last element to avoid memory leak  
    return ret  
end  
  
function Array:removeFirst()  
    return self:remove(1)  
end  
  
function Array:removeLast()  
    return self:remove(self.size)  
end  
  
function Array:removeElement(e)  
    local index = self:find(e)  
    if index ~= -1 then  
        self:remove(index)  
    end  
end  
  
function Array:toString()  
    local res = "Array: size = " .. self.size .. ", capacity = " .. self.capacity .. "\n["  
    for i = 1, self.size do  
        res = res .. self.data[i]  
        if i ~= self.size then  
            res = res .. ", "  
        end  
    end  
    res = res .. "]"  
    return res  
end  
  
-- Example usage:  
local arr = Array.new(5)  
arr:add(1, 10)  
arr:add(2, 20)  
arr:add(3, 30)  
print(arr:toString())  -- Output: Array: size = 3, capacity = 5 [10, 20, 30]

实际应用

由于Lua的表会自动进行扩展,我们不需要像在Java中那样显式地管理数组的容量。
在Lua中,我们通常使用ipairs来遍历数组部分(即,具有连续整数键的部分)的表。
由于Lua的表本身就是动态的,我们不需要像Java中那样处理数组的扩容。

lua">
Array = {}  
Array.__index = Array  
  
function Array.new()  
    local self = {}  
    self.size = 0  
    self.data = {}  
    setmetatable(self, Array)  
    return self  
end  
  
function Array:getSize()  
    return self.size  
end  
  
function Array:isEmpty()  
    return self.size == 0  
end  
  
function Array:addLast(e)  
    table.insert(self.data, e)  
    self.size = self.size + 1  
end  
  
function Array:addFirst(e)  
    table.insert(self.data, 1, e)  
    self.size = self.size + 1  
end  
  
function Array:add(index, e)  
    if index < 1 or index > self.size + 1 then  
        error("Add failed. Require index >= 1 and index <= size + 1.")  
    end  
    table.insert(self.data, index, e)  
    self.size = self.size + 1  
end  
  
function Array:get(index)  
    if index < 1 or index > self.size then  
        error("Get failed. Index is illegal.")  
    end  
    return self.data[index]  
end  
  
function Array:set(index, e)  
    if index < 1 or index > self.size then  
        error("Set failed. Index is illegal.")  
    end  
    self.data[index] = e  
end  
  
function Array:contains(e)  
    for _, v in ipairs(self.data) do  
        if v == e then  
            return true  
        end  
    end  
    return false  
end  
  
function Array:find(e)  
    for i, v in ipairs(self.data) do  
        if v == e then  
            return i  
        end  
    end  
    return -1  
end  
  
function Array:remove(index)  
    if index < 1 or index > self.size then  
        error("Remove failed. Index is illegal.")  
    end  
    local ret = table.remove(self.data, index)  
    self.size = self.size - 1  
    return ret  
end  
  
function Array:removeFirst()  
    return self:remove(1)  
end  
  
function Array:removeLast()  
    return self:remove(self.size)  
end  
  
function Array:removeElement(e)  
    local index = self:find(e)  
    if index ~= -1 then  
        self:remove(index)  
    end  
end  
  
function Array:toString()  
    local res = "Array: size = " .. self.size .. "\n["  
    for i, v in ipairs(self.data) do  
        res = res .. v  
        if i ~= self.size then  
            res = res .. ", "  
        end  
    end  
    res = res .. "]"  
    return res  
end  
  
-- Example usage:  
local arr = Array.new()  
arr:add(1, 10)  
arr:add(2, 20)  
arr:add(3, 30)  
print(arr:toString())  -- Output: Array: size = 3 [10, 20, 30]

lua">Array = {}  
Array.__index = Array  
  
function Array.new(capacity)  
    local self = {}  
    setmetatable(self, Array)  
  
    -- Initialize the array-like table  
    self.data = {}  
    self.size = 0  
    self.capacity = capacity or 10  
  
    return self  
end  
  
function Array:getSize()  
    return self.size  
end  
  
function Array:getCapacity()  
    return self.capacity  
end  
  
function Array:isEmpty()  
    return self.size == 0  
end  
  
function Array:addLast(element)  
    self:add(self.size + 1, element)  
end  
  
function Array:addFirst(element)  
    table.insert(self.data, 1, element)  
    self.size = self.size + 1  
    -- Handle capacity increase if needed (omitted for simplicity)  
end  
  
function Array:add(index, element)  
    if index < 1 or index > self.size + 1 then  
        error("Index out of bounds")  
    end  
  
    table.insert(self.data, index, element)  
    self.size = self.size + 1  
  
    -- Handle capacity increase if needed (omitted for simplicity)  
end  
  
function Array:get(index)  
    if index < 1 or index > self.size then  
        error("Index out of bounds")  
    end  
  
    return self.data[index]  
end  
  
function Array:set(index, element)  
    if index < 1 or index > self.size then  
        error("Index out of bounds")  
    end  
  
    self.data[index] = element  
end  
  
function Array:remove(index)  
    if index < 1 or index > self.size then  
        error("Index out of bounds")  
    end  
  
    local element = table.remove(self.data, index)  
    self.size = self.size - 1  
    return element  
end  
  
function Array:removeFirst()  
    return self:remove(1)  
end  
  
function Array:removeLast()  
    return self:remove(self.size)  
end  
  
function Array:toString()  
    local str = "Array: size = " .. self.size .. ", capacity = " .. self.capacity .. "\n["  
    for i = 1, self.size do  
        str = str .. tostring(self.data[i])  
        if i ~= self.size then  
            str = str .. ", "  
        end  
    end  
    str = str .. "]"  
    return str  
end  
  
-- Usage example  
local arr = Array.new()  
arr:addLast(10)  
arr:addLast(20)  
arr:addFirst(5)  
print(arr:toString())

http://www.niftyadmin.cn/n/5535107.html

相关文章

【期末复习】数据库系统概论(附带考点汇总)

第1章.绪论 目录 第1章.绪论1.1. 数据库系统概述1.1.1.基本概念1.1.2.产生和发展 1.2.概念模型1.2.1.三种模型1.2.2.概念模型1.2.3.关系模型 1.3.数据库系统结构1.3.1三级模式结构1.3.2.两级映像与数据独立性 第2章.关系型数据库2.1.关系2.2.关系操作2.2.1.基本关系操作2.2.2.关…

【chatgpt】pytorch打印模型model参数,使用parameters()方法和named_parameters()方法

在 PyTorch 中&#xff0c;一个模型的参数通常指模型中所有可训练的权重和偏置。每个 nn.Module 对象&#xff08;包括自定义的神经网络类&#xff09;都有一个 parameters() 方法和一个 named_parameters() 方法&#xff0c;这些方法可以用来访问模型中的所有参数。以下是这些…

Ollama基于Casaos一键部署,并接入Dify知识库,无需再为API付费

什么是Ollama Ollama是一个开源的大型语言模型服务工具&#xff0c;它帮助用户快速的运行大模型。浪浪云将它做为一键部署通过简单的安装&#xff0c;用户可以执行一条命令就可以运行开源大型语言模型&#xff0c;如 llama3 ,通以千问。极大地简化了部署和管理LLM的过程&#x…

使用go语言实现快速排序、归并排序、插入排序、冒泡排序、选择排序

冒泡排序&#xff08;Bubble Sort&#xff09;&#xff1a; 原理&#xff1a;比较相邻的元素&#xff0c;如果前一个比后一个大&#xff0c;就交换它们。这个过程会使得每一轮最大的元素“冒泡”到数组的末尾。时间复杂度&#xff1a;O(n^2)稳定性&#xff1a;稳定 // Bubble…

DIY智能音箱:基于STM32的低成本解决方案 (附详细教程)

摘要: 本文详细介绍了基于STM32的智能音箱的设计与实现过程&#xff0c;包括硬件设计、软件架构、语音识别、音乐播放等关键技术。通过图文并茂的方式&#xff0c;结合Mermaid流程图和代码示例&#xff0c;帮助读者深入理解智能音箱的工作原理&#xff0c;并提供实际操作指导。…

SpringBoot 启动流程一

SpringBoot启动流程一 我们首先创建一个新的springboot工程 我们不添加任何依赖 查看一下pom文件 我们创建一个文本文档 记录我们的工作流程 我们需要的是通过打断点实现 我们首先看一下启动响应类 package com.bigdata1421.start_up;import org.springframework.boot.Spr…

Linux 程序置顶脚本

引言 当希望我们运行的程序&#xff0c;一直保持在最顶端运行&#xff0c;即置顶状态&#xff0c;那么有很多种方式&#xff0c;这边给出一种脚本方式处理。 通过持续监控&#xff0c;当发现活动窗口不是我们所希望的窗口时&#xff0c;将我们希望置顶的程序窗口置顶。 脚本 …

docker初始化运行mysql容器时自动导入数据库存储过程问题

问题&#xff1a;用navicat导出的数据库脚本&#xff0c;在docker初始化运行mysql容器时&#xff0c;导入到存储过程时出错。 ERROR 1064 (42000) at line 2452: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for t…