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("字符串 ...
随机推荐
- easyui中combobox下拉内容进行分组
需求:对combobox下拉内容进行分组. 效果样式: 代码: valueField:'paymethod_name', textField:'paymethod_name', data:[{ &qu ...
- Netty学习笔记(三)——netty源码剖析
1.Netty启动源码剖析 启动类: public class NettyNioServer { public static void main(String[] args) throws Excep ...
- PAT甲级 进制转换题_C++题解
进制转换题 PAT (Advanced Level) Practice 进制转换题 目录 <算法笔记> 重点摘要 1015 Reversible Primes (20) 1019 Gene ...
- PAT(B) 1012 数字分类(Java)
题目链接:1012 数字分类 代码 /** * Score 20 * Run Time 142ms * @author wowpH * @version 1.1 */ import java.util ...
- 【数据结构】P1165 日志分析
题目描述 MM 海运公司最近要对旗下仓库的货物进出情况进行统计.目前他们所拥有的唯一记录就是一个记录集装箱进出情况的日志.该日志记录了两类操作:第一类操作为集装箱入库操作,以及该次入库的集装箱重量:第 ...
- WINDOWS记事本的换行\r\n
今天发现,\r\n才能换行,好像记事本不能改.
- STM32之ADC实例(基于DMA方式)
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/zouleideboke/article/details/75112224 ADC简介: ADC(An ...
- java之理解面向对象
1.程序设计的三种基本结构 顺序结构 顺序结构表示程序中的各操作是按照它们在源代码中的排列顺序依次执行的 选择结构 选择结构表示程序的处理需要根据某个特定的条件选择其中的一个分支执行.选择结构有单选择 ...
- PHP对程序员的要求更高
我这个文章标题可不是和大家开玩笑的哦 首先, 大家都知道, PHP也是一种编译型脚本语言, 和其他的预编译型语言不同, 它不是编译成中间代码, 然后发布.. 而是每次运行都需要编译.. 为此, 也 ...
- 谈jdbcTemplate与mybatis
为什么会产生 Hibernate Mybatis 这类的dao层框架 传统的jdbc 虽然执行速度很快,但是开发效率很低,随着面向对象开发的设计思想,在面向对象编程中 将对象 进行持久化,存入关系型的 ...