关于lua中的table,主要的困惑来自于table既可以当array用又可以当record用,有时候就会混淆不清。

lua中的table貌似是用map来实现的,array是语法糖,一种特例。下面是lua中构造table的标准方法:

local numbers = {[]=, []=, ["x"]=, [type]=}
numbers[] ==
numbers[] ==
numbers.x ==
numbers[type] ==

构造table的标准方法是建立[key]=value的键值对,访问的时候通过table[key]的形式来获取到value。

numbers.x 等价于 numbers[“x”]

把table当array用:不用写key了,访问的时候用table[index]的形式来获取到value。注意array不连续时遍历可能出现问题。

local numbers = {, , }

numbers[] = 

for i=,#numbers do
print(numbers[i]) -- 1,2,3
end

没有遍历到numbers[5],这是因为#numbers的值只是3,#这个操作符很奇怪,当array不连续的时候它并不能获取到正确的长度,获取到的是从1开始的连续数组的长度。所以一旦array发生了删改,就不能依赖#来获取到长度了。不过从另外一个方面讲,既然数组已经是不连续的了,那么获取table的长度也就没什么意义了。

如果在数组不连续的状况下仍然要对数组进行顺序遍历操作,可以使用table.maxn函数,这将得到最大的整数key。

这跟array本身的性质是一致的,想想在C++里面,如果要删除array里的一个元素,还不是得进行整块的数据移动。我想如果要把table当array用的话,就要尽量避免不要出现不连续的情况。

把table当record用:numbers.x 等价于 numbers[“x”],实际上numbers.x 这种就是字符串作为key的一种语法糖。

另外table可以record和array混合着用:

local numbers = {, , , x="hello", , y="ha?"}

for key,value in pairs(numbers) do
print("key: " .. tostring(key) .. ", value: " .. tostring(value))
end -- key: 1, value: 1
-- key: 2, value: 2
-- key: 3, value: 3
-- key: 4, value: 4
-- key: y, value: ha?
-- key: x, value: hello

这个其实也倒没什么,就是看起来畸形了点,实际中还是少用为妙。

关于table的遍历简单说一下看法:

如果把table当array用的并且是连续的话,使用for i=1,#numbers do的方法简洁不少。如果array不连续但是硬要遍历,那就用for i=1, table.maxn(numbers) do

如果把table当record用的话,那就用for key,value in pairs(numbers) do。这种方法也可以遍历array,但是貌似不是顺序遍历。

至于还有一种方法for key,value in ipairs(numbers) do,貌似效果跟#numbers是类似的,所以就没必要用它了,不方便。

PS:再多说一下对于table进行操作的几个函数:

table.getn() :效果和#一样

table.foreach(key, value):效果和for key,value in pairs(numbers) do 一样

table.foreachi(key, value): 效果和for key,value in ipairs(numbers) do 一样

table.insert(table, pos, value): 在array中指定位置插入一个元素,类似于STL中vector的insert,把插入元素时数组的移动封装起来了,挺好用的

table.remove : 不说了,和insert对应

table.concat(table, sep,  start, end) : 返回一个字符串,其中包含了以sep作为分隔符的从start到end的元素

具体的情况可以参考一篇文章:http://rangercyh.blog.51cto.com/1444712/1032925

Lua表的构造及遍历的更多相关文章

  1. c++ 由无向图构造邻接表,实现深度优先遍历、广度优先遍历。

    /* 首先,根据用户输入的顶点总数和边数,构造无向图,然后以用户输入的顶点 为起始点,进行深度优先.广度优先搜索遍历,并输出遍历的结果. */ #include <stdlib.h> #i ...

  2. <4>Lua表

    lua表 1: lua没有数组,但是表可以代替数组的功能(数组部分与非数组部分); 开始的, 1, 2, 3 ...称连续的索引; b.Lua表的连续索引的长度(数组部分);  #表的名字; --数组 ...

  3. Lua表(table)的用法_个人总结

    Lua表(table)的用法_个人总结 1.表的创建及表的介绍 --table 是lua的一种数据结构用来帮助我们创建不同的数据类型.如:数组和字典--lua table 使用关联型数组,你可以用任意 ...

  4. LUA表克隆方法归纳

    lua表克隆 将lua一个表, 克隆出一份为一个独立的另外一个表. 对于一个module, 如果在require之后,获得的表对象, 不能直接修改, 例如lua缓存此表, 但是多次逻辑执行, 都使用的 ...

  5. 【shell】构造并遍历二位数组的一种用法

    参考shell数组的部分操作用法,实现了构造和遍历二维数组的一种方式,具体如下: #数组元素以空格分割 sites=("www.a.com www.b.com www.c.com www.d ...

  6. SDUT 2142 数据结构实验之图论二:基于邻接表的广度优先搜索遍历

    数据结构实验之图论二:基于邻接表的广度优先搜索遍历 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Descript ...

  7. FIRST集合、FOLLOW集合、SELECT集合以及预测分析表地构造

    FIRST集合.FOLLOW集合.SELECT集合以及预测分析表地构造 FIRST集合的简单理解就是推导出的字符串的开头终结符的集合. FOLLOW集合简单的理解就对于非终结符后面接的第一个终结符. ...

  8. 求LR(0)文法的规范族集和ACTION表、GOTO表的构造算法

    原理 数据结构 // GO private static Map<Map<Integer,String>,Integer> GO = new HashMap<Map< ...

  9. lua表类型

    Lua的表的定义: typedef struct Table { CommonHeader; lu_byte flags; lu_byte lsizenode; /* log2 of size of ...

随机推荐

  1. 从省市区多重级联想到的,react和jquery的差别

    在我们的前端项目里经常会用到级联的select,比如省市区这样.通常这种级联大多是动态的.比如先加载了省,点击省加载市,点击市加载区.然后数据通常ajax返回.如果没有数据则说明到了叶子节点.   针 ...

  2. composer安装yii2或者laravel报错

    大概的信息就是提示让登陆github,然后就报错了 Could not fetch https://api.github.com/authorizations, enter your GitHub c ...

  3. How to running Job from a Form

    For Example we wanna run a Job with name  "FAN_TableList_CSV". So you must create a button ...

  4. js数组的splice方法

    w3school文章链接:http://www.w3school.com.cn/jsref/jsref_splice.asp splice:拼接,结合. splice()方法向数组添加/删除元素,返回 ...

  5. VC Dimension -衡量模型与样本的复杂度

    (1)定义VC Dimension: dichotomies数量的上限是成长函数,成长函数的上限是边界函数: 所以VC Bound可以改写成: 下面我们定义VC Dimension: 对于某个备选函数 ...

  6. [Solved] install Gentoo in VBox: network interface eth0 does not exist

    ERROR:interface eth0 does not exist; ensure that you have loaded the correct kernel moudle for your ...

  7. 1106. Lowest Price in Supply Chain (25)

    A supply chain is a network of retailers(零售商), distributors(经销商), and suppliers(供应商)-- everyone invo ...

  8. Java线程通信——wait() 和 notify()

    Object类中有关线程通信的方法有两个notify方法和三个wait方法,官方解释: void notify() Wakes up a single thread that is waiting o ...

  9. Pomodairo,番茄工作法-解刨篇

    处于“信息大爆炸”的 e 时代的我们每天必定要处理很多的事情,不管是工作.学习.生活......面对这么多的纷杂的事物我们将如何应对?如何做到有条不紊的进行?高效.轻松.愉快的完成它呢?这时一款精致的 ...

  10. Careercup - Facebook面试题 - 5890898499993600

    2014-05-01 02:30 题目链接 原题: Given a matrix of letters and a word, check if the word is present in the ...