Lua 学习之基础篇四<Lua table(表)>
table 是 Lua 的一种数据结构用来帮助我们创建不同的数据类型,如:数组、字典等。
Lua table 使用关联型数组,你可以用任意类型的值来作数组的索引,但这个值不能是 nil。
Lua table 是不固定大小的,你可以根据自己需要进行扩容。
Lua也是通过table来解决模块(module)、包(package)和对象(Object)的。 例如string.format表示使用”format”来索引table string。
table(表)的构造
构造器是创建和初始化表的表达式。表是Lua特有的功能强大的东西。最简单的构造函数是{},用来创建一个空表。可以直接初始化数组:
-- 初始化表
mytable = {}
-- 指定值
mytable[1]= "Lua"
-- 移除引用
mytable = nil
-- lua 垃圾回收会释放内存
当我们为 table a 并设置元素,然后将 a 赋值给 b,则 a 与 b 都指向同一个内存。如果 a 设置为 nil ,则 b 同样能访问 table 的元素。如果没有指定的变量指向a,Lua的垃圾回收机制会清理相对应的内存。
-- 简单的 table
mytable = {}
print("mytable 的类型是 ",type(mytable))
mytable[1]= "Lua"
mytable["wow"] = "修改前"
print("mytable 索引为 1 的元素是 ", mytable[1])
print("mytable 索引为 wow 的元素是 ", mytable["wow"])
-- alternatetable和mytable的是指同一个 table
alternatetable = mytable
print(alternatetable)
print(mytable)
print("alternatetable 索引为 1 的元素是 ", alternatetable[1])
print("alternatetable 索引为 wow 的元素是 ", alternatetable["wow"])
alternatetable["wow"] = "修改后"
print("mytable 索引为 wow 的元素是 ", mytable["wow"])
-- 释放变量
alternatetable = nil
print("alternatetable 是 ", alternatetable)
-- mytable 仍然可以访问
print("mytable 索引为 wow 的元素是 ", mytable["wow"])
mytable = nil
print("mytable 是 ", mytable)
mytable 的类型是 table
mytable 索引为 1 的元素是 Lua
mytable 索引为 wow 的元素是 修改前
table: 0x7fd2994074f0
table: 0x7fd2994074f0
alternatetable 索引为 1 的元素是 Lua
alternatetable 索引为 wow 的元素是 修改前
mytable 索引为 wow 的元素是 修改后
alternatetable 是 nil
mytable 索引为 wow 的元素是 修改后
mytable 是 nil
Table的访问
myTable[3] --当键是数字的时候,只有一种访问方式
myTable.name --当键是字符串的时候有两种访问方式
myTable["name"]
Table操作
- table.concat (list [, sep [, i [, j]]])
concat是concatenate(连锁,连接)的缩写,table.concat()函数列出参数中指定table的数组部分从start位置到end 的所有元素,元素见以指定的分隔符(sep)隔开
fruits = {"banana","orange","apple"}
-- 返回 table 连接后的字符串
print("连接后的字符串 ",table.concat(fruits))
-- 指定连接字符
print("连接后的字符串 ",table.concat(fruits,", "))
-- 指定索引来连接 table
print("连接后的字符串 ",table.concat(fruits,", ", 2,3))
连接后的字符串 bananaorangeapple
连接后的字符串 banana, orange, apple
连接后的字符串 orange, apple
- table.insert (list, [pos,] value)
在table的数组部分指定位置(pos)插入值为value的一个元素,pos参数可选,默认为数组部分末尾
fruits = {"banana","orange","apple"}
-- 在末尾插入
table.insert(fruits,"mango")
print("索引为 4 的元素为 ",fruits[4])
-- 在索引为 2 的键处插入
table.insert(fruits,2,"grapes")
print("索引为 2 的元素为 ",fruits[2])
for k,v in ipairs(fruits) do
print (k,v)
end
输出如下:
索引为 4 的元素为 mango
索引为 2 的元素为 grapes
1 banana
2 grapes
3 orange
4 apple
5 mango
- table.move (a1, f, e, t [,a2])
将a1中[f,e]范围内的元素拷贝到a2[t,t+e-f]范围内,拷贝内容为a1对应下标所含内容,有则copy。
t = {"12", 34, [8] = "56", m="78", n=90}
t1 = {}
table.move(t, 1, 3, 3, t1)
--把t中下标key为1-3的元素copy到t1 key为3-5的,t1的元素取决于t中范围内的元素
print("t: ")
print(i, v)
end
print("t1: ")
for i,v in pairs(t1) do
print(i, v)
end
t:
1 12
2 34
8 56
n 90
m 78
t1:
4 34
3 12
- table.remove (list [, pos])
返回table数组部分位于pos位置的元素,其后的元素会被前移,pos参数可选,默认为table长度,即从最后一个元素删起。
local tabLanguage = {
"Assemblylanguage",
"Lua",
"c",
"c++",
"swift",
"java",
"python",
"ruby"
};
for k,v in pairs(tabLanguage) do
print(k,v)
end
print("LUA>>>>>>the length of table tabLanguage :", #tabLanguage, "\n")
-- 删除元素
table.remove(tabLanguage)
table.remove(tabLanguage)
for k,v in pairs(tabLanguage) do
print(k,v)
end
print("LUA>>>>>>the length of table tabLanguage :", #tabLanguage, "\n")
-- 删除元素
local removeitem = table.remove(tabLanguage, 3)
for k,v in pairs(tabLanguage) do
print(k,v)
end
print("LUA>>>>>>the length of table tabLanguage :", #tabLanguage, "\n")
print("remove data of tabLanguage is : "..removeitem)
-- 元素设置nil
tabLanguage[4] = nil;
for k,v in pairs(tabLanguage) do
print(k,v)
end
print("LUA>>>>>>the length of table tabLanguage :", #tabLanguage, "\n")
输出如下:
1 Assemblylanguage
2 Lua
3 c
4 c++
5 swift
6 java
7 python
8 ruby
LUA>>>>>>the length of table tabLanguage : 8
1 Assemblylanguage
2 Lua
3 c
4 c++
5 swift
6 java
LUA>>>>>>the length of table tabLanguage : 6
1 Assemblylanguage
2 Lua
3 c++
4 swift
5 java
LUA>>>>>>the length of table tabLanguage : 5
remove data of tabLanguage is : c
1 Assemblylanguage
2 Lua
3 c++
5 java
LUA>>>>>>the length of table tabLanguage : 3
- table.sort (list [, comp])
对给定的table 进行升序(字母或数字大小)排序
fruits = {"banana","orange","apple","grapes"}
print("排序前")
for k,v in ipairs(fruits) do
print(k,v)
end
table.sort(fruits)
print("排序后")
for k,v in ipairs(fruits) do
print(k,v)
end
排序前
1 banana
2 orange
3 apple
4 grapes
排序后
1 apple
2 banana
3 grapes
4 orange
如果有指定comp比较函数,那么sort将按照函数的规则进行排序
local tbl = {
{id = 1, num = 88, level = 30},
{id = 2, num = 66, level = 10},
{id = 3, num = 66, level = 90},
{id = 4, num = 99, level = 20},
{id = 5, num = 66, level = 90}
}
table.sort(tbl, function(a, b)
if a.num > b.num then
-- 按num降序
return true
elseif a.num == b.num then
-- 如果num相等,按level升序
if a.level < b.level then
return true
elseif a.level == b.level then
-- 如果level相等,按id降序
return a.id > b.id
end
end
return false
end)
for _, v in pairs(tbl) do
print(string.format("id = %d, num = %d, level = %d", v.id, v.num, v.level))
end
-- id = 4, num = 99, level = 20
-- id = 1, num = 88, level = 30
-- id = 2, num = 66, level = 10
-- id = 5, num = 66, level = 90
-- id = 3, num = 66, level = 90
Table的遍历
Lua 中有默认三种方式遍历,其中pairs用于迭代元素,ipairs用于迭代数组
关于table-hash内部原理的介绍请参考:table-hash详解
for k,v in pairs(tbtest) do
但是这种遍历不是有序输出
tbtest = {
[1] = 1,
[2] = 2,
[3] = 3,
[4] = 4,
}
for key, value in pairs(tbtest) do
print(value)
end
4
1
2
3
- for k,v in ipairs(tbtest) do
有序输出,以tbtest中的key为顺序,必须是从1开始,ipairs只会从1开始按连续的key顺序遍历到key不连续为止。
tbtest = {
[1] = 1,
[2] = 2,
[3] = 3,
[5] = 5,
}
for k,v in ipairs(tbtest) do
print(v)
end
1
2
3
- for i=1, #(tbtest) do
'#'是用来获取table的长度,但这种遍历方式只能遍历当tbtest中存在key为1的value时才会出现结果,而且是按照key从1开始依次递增1的顺序来遍历,否则返回0
tbtest = {
["a"] = 1,
["b"] = 2,
["c"] = 3,
}
print(#(tbtest))
tbtest = {
[1] = 1,
[2] = 2,
[6] = 6,
}
print(#(tbtest))
--0
--2
Lua 学习之基础篇四<Lua table(表)>的更多相关文章
- Lua 学习之基础篇七<Lua Module,Package介绍>
Lua 之Module介绍 包管理库提供了从 Lua 中加载模块的基础库. 只有一个导出函数直接放在全局环境中: [require]. 所有其它的部分都导出在表 package 中. require ...
- Lua 学习之基础篇十<Lua 常见的语法规则>
下面讲一些lua 常见的用法和规则,可以为学习理解lua带来帮助,最后附上的部分是lua的基本操作,基本包含所有常用语法语句. 1. if判断 lua把 nil 和false 视为"假&qu ...
- Lua 学习之基础篇九<Lua 协同程序(Coroutine)>
引言 讲到协程,首先来介绍一下线程和协程的区别 lua协程和多线程 相同之处:拥有自己独立的桟.局部变量和PC计数器,同时又与其他协程共享全局变量和其他大部分东西 不同之处:一个多线程程序可以同时运行 ...
- Lua 学习之基础篇一<Lua 运算符>
引言 由于刚接触lua,个人觉得接触一门新语言,就要一定要对基础的部分做一个快速了解. 于是参考网上相关资料吸收并整理下来作为笔记,模糊的时候用来回顾一下. 这些部分基本都是经过自己手动测试梳理过,没 ...
- Lua 学习之基础篇八<Lua 元表(Metatabble)&&继承>
讲到元表,先看一段table的合并动作. t1 = {1,2} t2 = {3,4} t3 = t1 + t2 attempt to perform arithmetic on a table val ...
- Lua 学习之基础篇五<Lua OS 库>
lua os库提供了简单的跟操作系统有关的功能 1.os.clock() 返回程序所运行使用的时间 local nowTime = os.clock() print("now time is ...
- Lua 学习之基础篇二<Lua 数据类型以及函数库 汇总>
引言 前面讲了运算符,这里主要对Lua的数据处理相关的数据类型和函数库进行总结归纳,后面会再接着单独分开讲解具体使用. 首先因为Lua 是动态类型语言,变量不要类型定义,只需要为变量赋值. 值可以存储 ...
- Lua 学习之基础篇六<Lua IO 库>
引言 I/O 库提供了两套不同风格的文件处理接口. 第一种风格使用隐式的文件句柄: 它提供设置默认输入文件及默认输出文件的操作, 所有的输入输出操作都针对这些默认文件. 第二种风格使用显式的文件句柄. ...
- Lua 学习之基础篇三<Lua 字符串操作>
Lua字符串可以使用以下三种方式表示: 单引号间的一串字符. 双引号间的一串字符. [[和]]间的一串字符. string = [["Lua"]] print("字符串 ...
随机推荐
- 20175316 盛茂淞 2018-2019-2 《Java程序设计》实验五 《网络安全与编程》 实验报告
20175316 盛茂淞 2018-2019-2 <Java程序设计>实验五 <网络安全与编程> 实验报告 一.实验报告封面 课程:Java程序设计 班级:1753班 姓名:盛 ...
- spring cloud微服务实践四
spring cloud的hystrix还有一个配搭的库hystrix-dashboard,它是hystrix的一款监控工具,能直观的显示hystrix响应信息,请求成功率等.但是hystrix-da ...
- 最全APP安装/卸载/更新测试点
1.安装查看在安装过程中存在的提示信息是否明确,意思是否明确在安装过程中,点击取消按钮,能否正常退出安装程序,软件是否可用.安装时是否识别有SD卡,并默认安装到sd卡中安装过程中,接听电话或者短信,安 ...
- (二)Redis之Jedis概念和HelloWorld实现以及JedisPool的使用
一.Jedis概念 实际开发中,我们需要用Redis的连接工具连接Redis然后操作Redis, 对于主流语言,Redis都提供了对应的客户端: 官网:https://redis.io/clients ...
- Java并发(思维导图)
1,线程状态转换 无限期等待: 限期等待: 线程生命流程: 2,实现方式 代码实现样例[三种方式]: package com.cnblogs.mufasa.demo2; import java.uti ...
- .NetCore如何使用ImageSharp进行图片的生成
ImageSharp是对NetCore平台扩展的一个图像处理方案,以往网上的案例多以生成文字及画出简单图形.验证码等方式进行探讨和实践. 今天我分享一下所在公司项目的实际应用案例,导出微信二维码图片, ...
- solr-jd
springMVC.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=" ...
- Python中的一些常用模块1
OS模块,sys模块,time模块,random模块,序列化模块 os模块是与操作系统交互的一个接口 OS模块简单的来说是一个Python的系统编程操作模块,可以处理文件和目录这些我们日常手动需要做的 ...
- eclipse调试之edit source lookup path解决方案
转自:https://blog.csdn.net/zkn_CS_DN_2013/article/details/48731133
- C++ unordered_map桶增长规律
无序容器unordered_map存储为一组桶,各元素通过hash函数映射到各个桶中.心血来潮,来看一下桶的增长规律. #include <iostream> #include <s ...