关于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. composer安装yii2或者laravel报错

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

  2. 为checkboxSelectionModel赋值

    store.on('load', function(store, records, options) { sm.clearSelections();   //清空数据 Ext.each(records ...

  3. posix 消息队列

    注意 在涉及到posix消息的函数时, gcc 编译时要加-lrt参数, 如 gcc -lrt unpipc.c mqpack.c send.c -o send gcc -lrt unpipc.c m ...

  4. Java eclipse export jar包 包括第三方引入的jar

    1.安装fatjar插件 2.export jar 说明:安装后,操作说明以官网为准,不同的版本会有不同的右键菜单,我的版本(Eclipse Java EE IDE for Web Developer ...

  5. Ubuntu下配置samba服务器实现文件共享

    安装Samba 安装samba sudo apt-get install samba Kubuntu 安装系统设置的共享模块 sudo apt-get install kdenetwork-files ...

  6. Hadoop2

    http://www.cnblogs.com/miaoxiaoyu/archive/2012/07/29/2614060.html

  7. iOS 开发之粒子效果

    本文由糖炒小虾.Benna翻译 ,校对:sai.u0u0.iven.子龙山人 iOS 5中的UIKit粒子系统教程 Ray的话:这是第15篇.也是最后一篇<iOS 5 盛宴>中的iOS 5 ...

  8. 流水线(pipe-line)简介

    1.什么是流水线设计技术? 答:所谓流水线设计实际上是把规模较大.层次较多的组合逻辑电路分为几个级,在每一级插入寄存器组并暂存数据. K级就是有K个寄存器组,从上到下没有反馈电路. 2.流水线设计的深 ...

  9. eclipse的android智能提示设置

    eclipse的android智能提示设置 分类: android 技术2011-12-07 23:13 3069人阅读 评论(0) 收藏 举报 eclipseandroidtriggersjavaf ...

  10. Careercup - Facebook面试题 - 5179916190482432

    2014-05-01 00:45 题目链接 原题: input [,,,] output [,,,] Multiply all fields except it's own position. Res ...