`
aigo
  • 浏览: 2681566 次
  • 性别: Icon_minigender_1
  • 来自: 宜昌
社区版块
存档分类
最新评论

Lua – Table(数组遍历)

    博客分类:
  • Lua
Lua 
阅读更多

原文:http://zuolun.me/blog/2014/10/03/lua-table/

 

lua并不像其他语言一样提供了Array,List,Set,Queue等各种数据结构来完成各种不同数据操作,相比,lua只提供了一种数据结构 – Table,可谓以不变应万变了。 
lua的table可以以整数和字符串为下标,但是我们可以在一个table中存储各种数据,可以存储数据,字符串,函数,甚至表等各种结构,

整数索引

lua以整数为下标时,我们就可以像数组一样直接使用,其实lua底层,table是由两部分组成的,一部分是数组,用来存储像整数下标的这些值,一部分用哈希表来实现,用来存储像字符串这样索引的值。lua对table的大小没有限制,也就是说我们可以在使用过程中,在table中添加元素。

1
2
3
table1 = {10, 30, 50, 70, 90}
print(table1[0])   -- nil
print(table1[1])   -- 10


可以看到访问table1[0]返回nil,而table1[1]访问表中第一个值。当我们访问表中不存在的值时会返回nil值,默认table下标是从1开始的,而不是我们熟悉的像其他语言中从0开始,table可以使用任意整数为下标。

1
2
table2 = {10, 30, 50, 70, 90}
table3 = {[1] = 10, [2] = 30, [3] = 50, [4] = 70, [5] = 90}

上边这两种形式是等价的。

1
2
3
4
5
6
7
table2 = {10, 30, 50, 70, 90}
table3 = {[1] = 10, [2] = 30, [3] = 50, [40] = 70, [5] = 90}
table5 = {[2] = 30, [3] = 50}
print(#table2)  -- 5
print(#table3)  -- 3
print(#table4)  -- 2
print(#table5)  -- 0


可以使用#操作来计算下标从1开始并连续的table的大小,从上边例子可以看到,如果数组从零开始或者中间有下标不连续,计算的talbe的大小就只是从1到连续结束的元素的个数,如果table元素不是以1下标开始的计算结果为0。

字符串索引

1
2
3
4
5
6
table1 = {one = 0, two = true, three = "hello"}
table2 = {["one"] = 0, ["two"] = true, ["three"] = "hello"}
table3 = {}
table3.one = 0
table3.two = true
table3.three = "hello"


上边这三种形式创建的表都是一样的。但是有字符串索引的时候,就不能直接采用#操作求table的大小了。如果需要知道table的大小,肯能就需要一个计数器了。

遍历

1
2
3
4
table1 = {10, 30, 50, 70, 90}
for i=1, #table1 do
  print(table1[i])
end


像上边这样,当table使用整数索引的时候,我们可以像在其他语言中使用数组一样访问表中的元素。但是当下标不为整数,或者整数下标不连续时,我们就无法求得table的大小,上边这种遍历table的方法就行不通了,为了能够方便的遍历table,lua为我们提供了两个有用的方法pairs和ipairs。

1
2
3
4
table2 = {10, 30, [4] = 50, [10] = 70, [14] = 90, hello = "world"}
for k,v in pairs(table2) do
  print(k,v)
end  


使用pairs以key-valued的形式遍历了table2中所有的元素,就像我们在c++中使用迭代器一样。

1
2
3
4
table2 = {10, 30, [4] = 50, [10] = 70, [14] = 90, hello = "world"}
for i,v in ipairs(table2) do
  print(i,v)
end


但是当使用ipairs遍历时,只是访问了前两个元素,这是因为ipairs只遍历下标从1开始,连续增长的表。像上边table1这样的表,ipairs可以完全遍历,所以在使用的时候需要注意,当下标不连续,或者索引不是整数时,ipairs就停止遍历接下来的元素。

库方法

为了方便操作表,lua提供了几个对表操作的库方法

table.concat(list [, sep [, i [, j]]]) - 链接表中的元素,返回字符串。

1
2
tab = {"hello", "world", "lua"}
print(table.concat(tab, ":"))  -- hello:world:lua

有四个参数,后三个可选,第一个参数是表, 第二个参数分隔符,像上边的冒号,默认为空字符, 第三个参数,开始字符位置,默认下标为1, 第四个参数,结束下标,默认为表的大小。所以默认是链接整个表,我们也可以指定链接表中指定下标区域内的元素。

table.insert(list, [pos,] value) - 插入元素

1
2
3
tab = {"hello", "world", "lua"}
table.insert(tab, 100)
print(table.concat(tab, ": ")) -- hello: world: lua: 100


有三个参数,第一个表,第二个参数可选,插入的位置,默认是#table+1,第三个参数要插入的值,所以默认是讲元素插入到表最后的。像上边这样只有两个参数的,其实是省略掉了中间第二个元素,插值在最后。

table.pack(···) - 将所有参数打包到一个表中

1
2
3
4
5
tab = table.pack("hello", "world", "lua", 1, 4)
for k,v in pairs(tab) do
  print(k,v)
end
print(table.concat(tab, ": "))


接收任意多个参数,将所有参数打包到一个下标从1开始的表中,像上边,打包完后tab1 = {"hello", "world", "lua", 1, 4}但是不一定所有参数都是顺序打包的。

table.unpack (list [, i [, j]]) - 跟table.pack相反

1
2
3
4
5
6
7
tab = {"hello", "world", "lua", 1, 4}
a, b, c, d, e = table.unpack(tab)
print(a) -- hello
print(b) -- world
print(c) -- lua
print(d) -- 1
print(e) -- 4


返回多个参数,也可以指定需要的坐标范围,比如只返回第二到第四个元素,那么就返回3个元素。

table.remove(list [, pos]) - 移除表中元素

1
2
3
4
tab = {"hello", "world", "lua", 1, 4}
table.remove(tab, 2)
print(table.concat(tab, ": ")) -- hello: lua: 1: 4
print(tab[2]) -- lua


移除表中指定位置元素,有两个参数,第一个表,第二个移除元素的下标,可选,默认值是表中最后一个元素位置。第二个参数要在表的大小范围内,移除后指定位置元素后,下标后边元素向前移动。

table.sort (list [, comp]) - 排序

1
2
3
tab = {4, 10, 2, 1, 40, 6}
table.sort(tab)
print(table.concat(tab, " "))


对表中元素进行排序,默认从小到大,在第二个参数中也可以实现自己的排序条件

1
2
3
4
5
tab = {4, 10, 2, 1, 40, 6}
table.sort(tab, function(a, b)
  return a > b
end)
print(table.concat(tab, " "))


talbe除了像数组这种操作外,还可以用来实现其他数据结构,但是在lua中像List,Set这种数据结构,不一定比table方便,除了数据结构的操作外,lua还可以用表实现类的封装,继承等面向对象特性,而这一切都是基于元表的,感觉Lua的table无所不能啊。

List,Set实现看见《Programming in lua》

分享到:
评论

相关推荐

    Lua中遍历数组和table的4种方法

    首先,我们需要了解Lua中的数组和table是两种不同的数据结构。数组在Lua中其实就是一个特殊的table,它的索引是连续的数字。而table则是一种关联数组,可以使用字符串或者其他类型的值作为索引。在Lua中,通常通过...

    Lua中table的遍历详解

    在Lua中,`table`是其核心数据结构之一,它是一种动态数组,支持关联数组,即可以用任意类型的值作为键(key)。在处理table时,我们经常需要遍历其元素,这里将详细介绍四种常见的Lua table遍历方法。 1. `for key...

    详解Lua中的数组概念知识

    数组在Lua中被实现为一种称为“表”(table)的数据结构,它是一种动态大小的关联数组,允许我们存储任意类型的值,包括数字、字符串、函数甚至是其他表。这里我们将深入探讨Lua中的数组特性,包括一维数组、多维...

    Lua检测数组(tabble)中是否包含某个值

    在Lua编程语言中,表(table)是一种非常强大的数据结构,它可以被用作数组、哈希表、集合等多种用途。本文将详细介绍如何在Lua中检查一个表(通常当作数组使用时)是否包含特定的值。这个功能在很多实际应用中都...

    Lua中使用二维数组实例

    在Lua中,数组是基于索引的表格(table)类型,因此我们可以通过创建一个包含多个表格的表格来模拟二维数组。 以下是一个简单的二维数组创建示例: ```lua local二维数组 = {} for i = 1, 3 do 二维数组[i] = {} ...

    Lua Table转C# Dictionary的方法示例

    首先,类中有一个名为luatable的成员变量,用于存储Lua Table格式的字符串。类中的Parse方法用于解析这个字符串,并构建C# Dictionary。 解析过程中,博主首先检查了字符串是否符合Lua Table的格式,即首尾是否为大...

    C++遍历Lua table的方法实例

    在Lua中,table可以被用作数组、字典等数据结构,它们是Lua语言的核心部分。而C++是一种性能强大且灵活的编程语言,有时需要与Lua脚本交互。为了在C++程序中操作Lua的table,通常需要借助Lua的C API。 为了遍历Lua ...

    Lua table中安全移除元素的方法

    在Lua中,table是其核心数据结构,用于存储各种类型的数据。然而,当需要从table中安全地移除元素时,需要特别注意,以避免因不当操作引发的错误,例如内存泄漏。以下介绍三种安全移除元素的方法: 1. **从后往前...

    Lua教程(二十二):userdata

    ### Lua中的userdata详解 在深入探讨Lua中userdata的使用之前,我们需要先理解userdata的基本概念及其在Lua编程中的重要性。 #### userdata简介 在Lua中,`userdata`是一种用于存储指向C语言数据结构的指针的类型...

    Lua判断Table是否为空的方法(空的table即{})

    Lua是一种轻量级的脚本语言,它有着简洁而强大的数据结构——table,可以被用来存储数组、字典等多种类型的数据。在编程实践中,我们经常需要判断一个table是否为空,也就是是否没有存储任何数据。在Lua语言中,判断...

    lua程序实现对两个文件的表的比较

    表是Lua的核心数据结构,它是一个动态大小的关联数组,可以存储任意类型的值,包括数字、字符串、其他表甚至是函数。在进行两个文件的表比较时,我们通常关心的是表的键(key)和对应的值(value)是否相同。 假设...

    Lua的table库函数insert、remove、concat、sort详细介绍

    Lua中的table库函数是编程中常用的操作集合,主要用于处理table数据结构。在这篇文章中,我们将深入探讨四个关键的函数:`insert`、`remove`、`concat`和`sort`,并提供相应的使用实例。 1. **table.insert(table, ...

    Lua table类型学习笔记

    Lua中的table类型是一种非常核心且灵活的数据结构,它不仅可以作为数组使用,还能实现关联数组、哈希表等复杂数据组织形式。以下是对table类型的详细解释: 1. **基础概念** - **数组与关联数组**:Lua的table既...

    phthon导出excel成lua表(批量)

    为了将DataFrame转换为Lua表格,我们可以遍历DataFrame的每一行和每一列,生成对应的Lua代码字符串: ```python def df_to_lua(df): lua_code = "{\n" for i, row in df.iterrows(): lua_row = " {" for j, ...

    举例讲解Lua中的Table数据结构

    总的来说,Lua 的 Table 数据结构是一种强大而灵活的工具,可以用来实现数组、字典、集合、队列、栈等多种数据结构,甚至可以用来实现面向对象编程。理解并熟练掌握 Table 的使用是成为 Lua 程序员的关键。

    Lua中获取table长度问题探讨

    在新版本的Lua中,获取table长度的推荐方法是通过遍历table,并记录遇到的最后一个非nil键的索引。这种方法可以准确计算出table的长度,但它需要手动实现,并且如果table非常大,可能会带来性能上的影响。 由于上述...

    深入谈谈lua中神奇的table

    在 Lua 语言中,table 是一个非常核心且多功能的数据结构,它扮演着多种角色,包括字典、数组、环境(命名空间)等。下面我们将详细探讨 Lua 中 table 的各种特性和用途。 首先,table 作为字典使用时,其键(key)...

    excel转成lua文件

    这段代码首先使用`pd.read_excel()`函数读取Excel文件到一个DataFrame对象,然后遍历每一行,将其转换为Lua语法的数组表示。最后,将整个Lua表格写入到名为`data.lua`的文件中。 为了便于使用和理解,这个转换过程...

    lua-table:具有超能力的lua表

    在Lua中,表格(table)是其核心数据结构,它不仅作为数组使用,还兼备了哈希映射的功能,因此在Lua中被称为“超能力”表格。本文将深入探讨lua-table的特性和使用技巧。 一、Lua表格的基本概念 1. **数组与哈希的...

    Lua的for in和pairs1

    pairs 语法可以遍历任何类型的表,包括数组和对象,而 ipairs 语法只能遍历数组类型的表。 在 ipairs 语法中,迭代函数会返回三个值:迭代函数、表和初始索引值。这些值可以用来遍历表中的元素。 在 pairs 语法中...

Global site tag (gtag.js) - Google Analytics