Lua table遍历
工作中,栽了一个“坑”,特此备录。
【1】遍历table1,每次结果可能都不同
-- 获取value
local table_1 = {id="", name="wang", sage="", addr="xian"}
for k, v in pairs(table_1) do
print(k, v)
end
每次结果可能都不同
【2】遍历table2,每次结果相同
local table_2 = {"", "wang", "", "xian"} print('len2 : ' .. (#table_2)) local value_idx = {}
for i = , #table_2 do
print(i .. ' '.. table_2[i])
table.insert(value_idx, table_2[i])
end
print(table.concat(value_idx, ",")) for k,v in ipairs(table_2) do
print(k, v)
end --[[
len2 : 4
1 101
2 wang
3 18
4 xian
101,wang,18,xian
1 101
2 wang
3 18
4 xian
--]]
每次结果相同
【3】table遍历的方法
经学习,总结一下table遍历的四种方法:
(3.1)利用迭代器pairs的方式
形式如下:
for key, value in pairs(tbtest) do
-- TODO
end
示例如上第一节的实例,不再赘述。
特点:一定会遍历所有的元素,但并非按tbtest中key的排列顺序,而是根据tbtest中key的hash值排列的顺序来遍历的。
(3.2)利用迭代器ipairs的方式
形式如下:
for key, value in ipairs(tbtest) do
-- TODO
end
示例如上第二节的实例,另外,再如下:
tbtest = {[] = , [] = , [] = , [] = } for key, value in ipairs(tbtest) do
print('key : ' .. key .. ' value : ' .. value)
end --[[
key : 1 value : 100
key : 2 value : 200
key : 3 value : 300
--]]
特点:必须要求tbtest中的key为顺序的,且必须是从1开始,ipairs只会从1开始按连续的key顺序遍历到key不连续为止。
(3.3)下标索引方式
形式如下:
for i = , #(tbtest) do
-- TODO
end
示例如上第二节的实例,不再赘述。
特点:只能遍历当tbtest中存在key为1的场景,而且是严格按照key从1开始依次递增1的顺序来遍历,找不到下一个递增是1的key时候就结束遍历,无论后面是否是顺序的key
(3.4)自定义迭代器
形式如下:
function pairsByKeys(t)
local a = {}
for n in pairs(t) do
a[#a+] = n
end
table.sort(a)
local i =
return function()
i = i +
return a[i], t[a[i]]
end
end for key, value in pairsByKeys(tbtest) do
if destKey <= key then
-- TODO
end
end
应用场景:
网上有个实际的应用场景,感觉挺应景的。比如,学校按照班级排名顺序给学生发奖金,规则如下:
1.1 排名前4(1,2,3,4)的学生奖励500元
1.2 排名前8(5,6,7,8)的学生奖励300元
1.3 排名前12(9,10,11,12)的学生奖励200元
1.4 排名前16(13,14,15,16)的学生奖励100元
现在,准备给小王发奖金,小王排名第7名,理论应该发奖金是300元。
但是,对比方式(1)和方式(4)的遍历结果如下:
tbtest = {[] = , [] = , [] = , [] = } function pairsByKeys(t)
local a = {}
for n in pairs(t) do
print('n : ' .. n)
a[#a+] = n
end
table.sort(a)
local i =
return function()
i = i +
return a[i], t[a[i]]
end
end print('-------------方式(3.1)-------------')
for k, v in pairs(tbtest) do
if <= k then
print('pairs : ' .. k .. ' value : ' .. v)
break
end
end print('-------------方式(3.4)-------------')
for key, value in pairsByKeys(tbtest) do
print('key : ' .. key .. ' value : ' .. value)
if <= key then
print('pairsByKeys : ' .. key .. ' value : ' .. value)
return
end
end --[[
-------------方式(3.1)-------------
pairs : 12 value : 200
-------------方式(3.4)-------------
n : 4
n : 12
n : 8
n : 16
key : 4 value : 500
key : 8 value : 300
pairsByKeys : 8 value : 300
--]]
原因分析:因为方式(1)是按照key值的hash值进行遍历的,而不是按照key值的大小顺序进行遍历。
而方式(4)对方式(1)做了改进,先对所有的key值进行了排序,然后再依次遍历,满足预期的效果。
综上所述:方式(4)是对方式(1)的不足进行了弥补,具体应用过程中,根据实际情况,择优选择遍历方法。
Good Good Study, Day Day Up.
顺序 选择 循环 总结
Lua table遍历的更多相关文章
- Lua Table pairs输出顺序问题 (版本差异 解决数字索引间断并兼容字符串索引)
问题标签: Lua Table 迭代器;Lua Table 输出顺序; Lua Table 顺序输出;Lua Table 数字索引 字符串索引;Lua Table pairs; 问题背景: 使用pai ...
- lua中遍历table的几种方式比较
当我在工作中使用lua进行开发时,发现在lua中有4种方式遍历一个table,当然,从本质上来说其实都一样,只是形式不同,这四种方式分别是: for key, value in pairs(tbtes ...
- lua table integer index 特性
table.maxn (table) Returns the largest positive numerical index of the given table, or zero if the t ...
- lua table remove元素的问题
当我在工作中使用lua进行开发时,发现在lua中有4种方式遍历一个table,当然,从本质上来说其实都一样,只是形式不同,这四种方式分别是: for key, value in pairs(tbtes ...
- lua table表判断是否为空
官方手册里早已经给了答案,那就是靠lua内置的next函数 即如此用: a = {} if next(a) == nil then next其实就是pairs遍历table时用来取下一个内容的函数. ...
- 关于 lua table表存储函数且运用
--table 是lua的一种数据结构用来帮助我们创建不同的数据类型.如:数组和字典--lua table 使用关联型数组,你可以用任意类型的值来做数组的索引,但这个值不能是nil--lua tabl ...
- 【Lua】Lua + openresty遍历文件目录
OpenResty (也称为 ngx_openresty)是一个全功能的 Web 应用服务器,它打包了标准的 Nginx 核心,很多的常用的第三方模块,以及它们的大多数依赖项. 今天用OpenRest ...
- Lua 学习之基础篇四<Lua table(表)>
table 是 Lua 的一种数据结构用来帮助我们创建不同的数据类型,如:数组.字典等. Lua table 使用关联型数组,你可以用任意类型的值来作数组的索引,但这个值不能是 nil. Lua ta ...
- 树形打印lua table表
为方便调试lua程序,往往想以树的形式打印出一个table,以观其表内数据.以下罗列了三种种关于树形打印lua table的方法;法一 local print = print local tconca ...
随机推荐
- php 一行代码解决二维数组去重
array_unique($array, SORT_REGULAR);
- sysbench对MySQL的压测
QPS - query per second TPS - transaction per second 不是特别关注,每个业务场景中事务标准是不一样的 Ⅰ.sysbench测试框架 Ⅱ.常用测试脚本 ...
- 转:三款免费好用的Gif录屏神器
原文链接:三款免费好用的Gif录屏神器 自己用了 ScreenToGif 版本2.14.1下载地址 原文内容: 三款免费好用的Gif录屏神器 2018年06月02日 18:52:21 独家雨 ...
- laravel 控制器类DB类操作
例子:TrGo表(trgo_chip): laravel框架建立:TrGoModel <?php namespace TrChaos\Model; class TrGoModel extends ...
- 2018-2019-2 网络对抗技术 20165336 Exp4 恶意代码分析
2018-2019-2 网络对抗技术 20165336 Exp4 恶意代码分析 1.实践目标 1.1是监控你自己系统的运行状态,看有没有可疑的程序在运行. 1.2是分析一个恶意软件,就分析Exp2或E ...
- Init wms goodlocation data
insert goodlocation: CREATE PROCEDURE [dbo].[sp_insert_goodlocation] -- Add the parameters for the s ...
- Elasticsearch学习笔记(九)partial update
一.什么是partial update? PUT /index/type/id,创建文档&替换文档,就是一样的语法 一般对应到应用程序中,每次的执行流程基本是这样的: (1)应用程序先发起一个 ...
- shell 字符串比较 算数比较 文件条件测试
set-group-id即set-gid -->授予了程序其所在组的访问权限 set-user-id即set-uid -->授予了程序其拥有者的访问权限而不是其使用者的访问权限 set-g ...
- what's the 白盒测试
what's the 白盒测试 白盒测试又称结构测试.透明盒测试.逻辑驱动测试或基于代码的测试.盒子指的是被测试的软件,白盒指的是盒子是可视的,你清楚盒子内部的东西以及里面是如何运作的.白盒要考虑测试 ...
- ADB——修改手机默认参数
修改原理 修改设置的原理主要是通过 settings 命令修改 /data/data/com.android.providers.settings/databases/settings.db 里存放的 ...