Lua table 是一种数据结构,它可以用来存储任意类型的数据,包括字符串、数字、布尔值、函数、甚至是其他的表。Lua table 可以看作是一个关联数组,它可以使用键值对的方式来存储和访问数据。
Lua table 的定义非常灵活,可以使用多种方式来创建表。最常见的方法是使用大括号 {} 来创建一个新表,例如:
local t = {} -- 创建一个新表
也可以使用函数 table.new() 来创建一个新表:
local t = table.new() -- 创建一个新表
Lua 表中的元素可以通过键来访问。键可以是字符串或者整数。如果键是字符串,则必须使用引号将其包围起来。例如:
t["name"] = "John" -- 设置 name 键的值 print(t["name"]) -- 获取 name 键的值
如果键是整数,则不必使用引号将其包围起来。例如:
t[1] = "John" -- 设置 1 键的值 print(t[1]) -- 获取 1 键的值
Lua 表中也可以使用多重键来获取或者赋值元素。例如:
t["name"]["first"] = "John" -- 赋予 name.first 键的值 print(t["name"]["first"]) -- 获得 name.first 键的值< p > Lua table 的大小不固定 , 可以动态地向表中添加或者删除元素 , 并且不会限制你在向表中添加多重键时所能使用的最大深度 ( depth ) 。 Lua table 的这些特性都使得它成为了一个十分有用而强大的工具 , 在 Lua 社区中广泛地应用于各种场合之中。 p >
Lua中的table不是一种简单的数据结构,它可以作为其它数据结构的基础。如数组、记录、线性表、队列和集合等,在Lua中都可以通过table来表示。
在lua中通过整数下标访问表中的元素即可简单的实现数组。并且数组不必事先指定大小,大小可以随需要动态的增长。
a = {}
for i = 1,100 do
a[i] = 0
end
print("The length of array "a" is " .. #a)
squares = {1, 4, 9, 16, 25}
print("The length of array "a" is " .. #squares)
在Lua中习惯上数组的下表从1开始,Lua的标准库与此习惯保持一致,因此如果你的数组下标也是从1开始你就可以直接使用标准库的函数,否则就无法直接使用。
Lua中主要有两种表示矩阵的方法,第一种是用数组的数组表示。也就是说一个表的元素是另一个表。
local N = 3
local M = 3
mt = {}
for i = 1,N do
mt[i] = {}
for j = 1,M do
mt[i][j] = i * j
end
end
mt = {}
for i = 1, N do
for j = 1, M do
mt[(i - 1) * M + j] = i * j
end
end
Lua中用tables很容易实现链表,每一个节点是一个table,指针是这个表的一个域,并且指向另一个节点(table)。例如,要实现一个只有两个域:值和指针的基本链表,代码如下:
list = nil
for i = 1, 10 do
list = { next = list ,value = i}
end
local l = list
while l do
--print(l.value)
l = l.next
end
虽然可以使用Lua的table库提供的insert和remove操作来实现队列,但这种方式实现的队列针对大数据量时效率太低,有效的方式是使用两个索引下标,一个表示第一个元素,另一个表示最后一个元素。
List = {}
--创建
function List.new()
return {first = 0,last = -1}
end
--队列头插入
function List.pushFront(list,value)
local first = list.first - 1
list.first = first
list[first] = value
end
--队列尾插入
function List.popFront(list)
local first = list.first
if first > list.last then
error("List is empty")
end
local value = list[first]
list[first] = nil
list.first = first + 1
return value
end
function List.popBack(list)
local last = list.last
if list.first > last then
error("List is empty")
end
local value = list[last]
list[last] = nil
list.last = last - 1
return value
end
--测试代码
local testList = {first = 0,last = -1}
local tableTest = 12
List.pushFront(testList,tableTest)
print( List.popFront(testList))
简单实现堆栈功能,代码如下:
local stackMng = {}
stackMng.__index = stackMng
function stackMng:new()
local temp = {}
setmetatable(temp,stackMng)
return temp
end
function stackMng:init()
self.stackList = {}
end
function stackMng:reset()
self:init()
end
function stackMng:clear()
self.stackList = {}
end
function stackMng:pop()
if #self.stackList == 0 then
return
end
if self.stackList[1] then
print(self.stackList[1])
end
return table.remove(self.stackList,1)
end
function stackMng:push(t)
table.insert(self.stackList,t)
end
function stackMng:Count()
return #self.stackList
end
--测试代码
object = stackMng:new()
object:init()
object:push(1)
object:pop()
在Lua中用table实现集合是非常简单的,见如下代码:
reserved = {
["while"] = true, ["end"] = true,
["function"] = true, ["local"] = true,
}
for k,v in pairs(reserved) do
print(k,"->",v)
end
CGI::Session 可以为用户和CGI环境保存持久的会话状态,会话使用后需要关闭,这样可以保证数据写入到存储当中,当会话完成后,你...
在 R 语言中,我们可以从存储在 R 语言环境外的文件中读取数据。 我们还可以将数据写入将被操作系统存储和访问的文件。 R 语言可...
逻辑回归是回归模型,其中响应变量(因变量)具有诸如True / False或0/1的分类值。 它实际上基于将其与预测变量相关的数学方程测...
安装 Kotlin 插件Android Studio 从 3.0(preview)版本开始将内置安装 Kotlin 插件。打开 Settings ( Mac 为 Preferences) 面板...
基本概念并发与并行并发:同一时间段内执行多个任务(你早上在编程狮学习Java和Python)并行:同一时刻执行多个任务(你和你的网...