lua中table的遍历,以及删除

Lua 内table遍历

在lua中有4种方式遍历一个table,当然,从本质上来说其实都一样,只是形式不同,这四种方式分别是:

1. ipairs

for index, value in ipairs(table) do

end

注:这种方式的遍历只会从key为1的地方开始,一直以key递增1的顺序来遍历,若找到一个递增不是1的key就结束遍历,无论后面是否仍然是顺序的key。

 1 --Sample_1:
 2 local tab1 =
 3 {
 4 [1] = 1,
 5 [2] = 2,
 6 [3] = 3,
 7 [4] = 4,
 8 }
 9 for key, value in ipairs(tab1) do
10   print(value)    -->1 2 3 4
11 end
--Sample_2:
local tab2 =
{
    [1] = 1,
    [2] = 2,
    [3] = 3,
    [5] = 5,
    [6] = 6,
}
for key, value in ipairs(tab2) do
    print(value)    -->1 2 3
end
--Sample_3:
local tab3 =
{
    [2] = 2,
    [3] = 3,
    [4] = 4,
}
for key, value in ipairs(tab3) do
    print(value)    -->没有打印
end

2. pairs

for key, value in pairs(table) do

end

这种方式的遍历是根据table中key的hash值排列的顺序来遍历,并非是table中key的排列顺序,并且不关心key是否从1开始和key是否以1递增。

--Sample_1:
local tab1 =
{
    [1] = 1,
    [2] = 2,
    [3] = 3,
    [4] = 4,
}

for key, value in pairs(tab1) do
    print(value)    -->1 2 4 3
end
--Sample_2:
local tab2 =
{
    [1] = 1,
    [2] = 2,
    [3] = 3,
    [5] = 5,
    [6] = 6,
}
for key, value in pairs(tab2) do
    print(value)    -->6 2 3 1 5
end
--Sample_3:
local tab3 =
{
    ["1"] = 1,
    ["2"] = 2,
    ["3"] = 3,
    ["5"] = 5,
    ["6"] = 6,
}
for key, value in pairs(tab3) do
    print(value)    -->1 3 2 5 6
end

3. #table

for i=1, #(table) do

end

注:这种方式的遍历关键的地方在于获取table的大小,#(table)只会从key为1的地方开始,一直以key递增1的顺序来遍历,若找到一个递增不是1的key就结束遍历并且返回table的大小,无论后面是否仍然是顺序的key。

--Sample_1:
local tab1 =
{
    [1] = 1,
    [2] = 2,
    [3] = 3,
    [4] = 4,
}

print("#table:"..#(tab1))        -->4
for i = 1, #(tab1) do
    print(tab1[i])    -->1 2 3 4
end

--Sample_2:
local tab2 =
{
    [1] = 1,
    [2] = 2,
    [3] = 3,
    [5] = 5,
    [6] = 6,
}

print("#table:"..#(tab2))    -->3
for i = 1, #(tab2) do
    print(tab2[i])
end
--Sample_3:
local tab3 =
{
    [2] = 2,
    [3] = 3,
    [4] = 4,
}

print("#table:"..#(tab3))    -->0
for i = 1, #(tab3) do
    print(tab3[i])    -->没有打印
end

4. table.maxn(table)

  这种方式的遍历和第三种方式差不多,关键的地方是在table.maxn(table),table.maxn(table)的意思是获取table中最大值的key。 

local tab2 =
{
    [1] = 1,
    [2] = 2,
    [3] = 3,
    ["a"] = 4,
    [5] = 5,
    [6] = 6,
}

print("table.maxn:"..table.maxn(tab2))    -->6
for i = 1, table.maxn(tab2) do
    print(tab2[i])    -->1 2 3 nil 5 6
end
--Sample_2:
local tab3 =
{
    [2] = 2,
    [3] = 3,
    [4] = 4,
}

print("table.maxn:"..table.maxn(tab3))    -->4
for i = 1, table.maxn(tab2) do
    print(tab3[i])    -->nil 2 3 4 nil nil
end

Lua table移除某一项,或多项内容

  有两种方式来移除table中的数据

1. 按下标来移除

  table.remove(table_name, [pos,])
  直接移除某个下标的数据,例如:

local t = {5, 6, 7, 8}
table.remove(t, 2)
for k, v in pairs(t) do
    print(k, v)
end
输出
1     5
2     7
3     8

2.将某项值置空

  table[k] = nil  直接将某项值置空

  

local a = {
    [‘3019‘] = 3019,
    [‘3020‘] = 3020,
    [‘3021‘] = 3021,
    [‘3017‘] = 3017
}

a[‘3019‘] = nil

for k, v in pairs(a) do
    print(k, v)
end

输出:
3020    3020
3017    3017
3021    3021

原文地址:https://www.cnblogs.com/slysky/p/10419802.html

时间: 2024-11-08 18:14:20

lua中table的遍历,以及删除的相关文章

c/c++_Lua交互----关于Lua中table类型的使用实例

lua中的复合类型 只有table 类型,你可以当做任意容器使用  ,比如 数组    PHP中的关联数组  C++中的 std::map 等等  而且提供了很方便的使用 下面是lua中 table类型的使用 c++加载代码 #include "string.h" extern "C" { #include "lualib.h" //包含lua lib #include "lauxlib.h" //辅助函数 }; #pragm

Lua中table类型的源码实现

  1.概述 table是lua中唯一的表示数据结构的工具.它可以用于实现数据容器.函数环境(Env).元表(metatable).模块(module)和注册表(registery)等其他各种用途.因此了解table的实现是非常有必要的,根据<Lua中数据类型的源码实现>中知道,在Lua中,table是由结构体体Table来实现的.下面将以Lua 5.2.1的源码来看table的实现.   2.实现原理 在Lua5.0以后,table是以一种混合型数据结构来实现的,它包含一个哈希表部分和一个数

lua 中table的使用和分析

1.table有4种基本操作:读,写,迭代和获取长度. lua中没有删除操作而是将对应键位的值设置为nil. lua的内部定义是在lobject.h </pre><pre code_snippet_id="580775" snippet_file_name="blog_20150115_1_6202329" name="code" class="python"><pre name="co

lua中table需要注意的一点东西

关于table的文字说明我引用了lua程序设计的一些语句来概括表述: table类型实现了"关系数组"."关系数组"是一种具有特殊索引方式的数组.不仅可以通过整数来索引他,还可以使用字符串活着其他类型的值(除了nil)来索引他.此外,table没有固定大小,可以动态的添加任意数量的元素到一个table中. 在lua中,table既不是"值"也不是"变量",而是"对象",可以将一个table想象成一种动态分配

lua中table的实现

table 在lua中是一个非常常用的数据结构,可以用来存放各种类型的元素,那么就会让人好奇,它这么强大,它是用什么数据结构实现的呢 首先,考虑 table = {1, 2, 3, 4, 5, 6, 7, 8} 这样的结构, 为了获得最快的访问速度,它是用数组实现的 那么如果执行table[10000] = 10; 莫非要创建10000个元素的数组,没有值的都存为nil,这样的空间利用效率太低无法接受,所有除了数组段之外,table还有一个哈希段,10000这个key会存在哈希段中,当太大的ke

Lua中table内建排序与C/C++/Java/php/等内排序算法的排序效率比较

Lua这类脚本语言在处理业务逻辑作为配置文件的时候方便省事 但是在大量需要 运算的地方就显得略微不足   按照 Lua内建排序算法 对比C/C++ PHP Java等的快速排序算法进行一下比较. 快速排序算法是基于冒泡排序,优化而来,时间复杂度T(n)=O(nLog2n)  ,可见内部采用了二分策略 . 发现在LuaIDE LDT下直接运行效率要比 通过C++加载运行Lua脚本效率高的多  拿500W个数据排序 来说  ,脚本如下 同样的排序脚本Lua解释器的内置排序算法在LDT下,运行速度比通

lua中table 库函数 insert、remove、concat、sort的简单使用【简记】

1.insert  1 do 2 t1 = {"欲", "泪", "成", "雪"} 3 table.insert(t1,"seeyou")-- 往t1末尾插入元素 "seeyou" 4 table.insert(t1, 3, "bug")-- 往t1索引为3的位置插入元素"bug" 5 for i,v in ipairs(t1) do print

lua中遍历table的几种方式比较

在工作中使用lua进行开发时,发现在lua中有4种方式遍历一个table,当然,从本质上来说其实都一样,只是形式不同,这四种方式分别是: for key, value in pairs(tbtest) do XXX end for key, value in ipairs(tbtest) do XXX end for i=1, #(tbtest) do XXX end for i=1, table.maxn(tbtest) do XXX end 前两种是泛型遍历,后两种是数值型遍历.当然你还会说

Lua table 顺序遍历

在Lua中, 如何遍历一个Table元素,主要有两种类型: 1.pairs:下标从1开始,并且是连续的才可以使用 2.ipairs:是无序的示例 local t = { [10] = 1, [20] = 2, [30] = 3, [40] = 4, [50] = 5, [60] = 6 } for k,v in pairs (t) do print("t1", k, v) end for k,v in ipairs (t) do print("t2", k, v)