Lua table 顺序遍历

在Lua中, 如何遍历一个Table元素,主要有两种类型:

  • 1.pairs:下标从1开始,并且是连续的才可以使用
  • 2.ipairs:是无序的
    示例
    1. local t = {
    2. [10] = 1,
    3. [20] = 2,
    4. [30] = 3,
    5. [40] = 4,
    6. [50] = 5,
    7. [60] = 6
    8. }
    9. for k,v in pairs (t) do
    10. print("t1", k, v)
    11. end
    12. for k,v in ipairs (t) do
    13. print("t2", k, v)
    14. end

打印结果:

可以发现,使用ipairs的结果根本就没有打印出来,因为ipairs是从1开始打印的,
那像这种不是从1开始的, 又想要顺序打印要怎么做呢!
这时候需要借助另外一个表,原理类似于这样子

  1. local temp = {
  2. [1] = k1,
  3. [2] = k2,
  4. [3] = k3,
  5. [4] = k4,
  6. [5] = k5
  7. }

其中k1,k2...k5分别代表 t中的下标值(10,20,......60)
只要做到这个, 就可以用ipairs遍历temp,从而得到相对应的t了。

这里在《program in lua》中已经有现在代码可以使用了,

  1. function pairsByKeys(t)
  2. local a = {}
  3. for n in pairs(t) do a[#a + 1] = n end
  4. table.sort(a)
  5. local i = 0
  6. return function ()
  7. i = i + 1
  8. return a[i], t[a[i]]
  9. end
  10. end

改变以前的遍历代码为以下,其实就是pairs改为 pairsBykeys

  1. for k,v in pairs (t) do
  2. print("t1", k, v)
  3. end
  4. print("___________________")
  5. for k,v in Utils.pairsByKeys (t) do
  6. print("t2", k, v)
  7. end

打印如下,可以看到, 下面一排的打印结果已经是有序的了!

来自为知笔记(Wiz)

时间: 2024-10-12 21:17:14

Lua table 顺序遍历的相关文章

Lua Table pairs输出顺序问题 (版本差异 解决数字索引间断并兼容字符串索引)

问题标签: Lua Table 迭代器;Lua Table 输出顺序; Lua Table 顺序输出;Lua Table 数字索引 字符串索引;Lua Table pairs; 问题背景: 使用pairs输出table时,其输出顺序与通常认知不相符. 例如使用pairs输出如下table T = { [1] = "1", [2] = "1", [3] = "1", [4] = "1", [5] = "1",

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 [

lua for循环遍历table的几种区别

众人皆知的是有两种:ipairs和pairs,这两种相信大家也是很了解了,其中ipairs是从头(idx=1)开始往后顺序遍历,遇到nil即退出循环:而pairs则是非顺序遍历,只要里面有值都可以遍历的到. 那假如我需要顺序遍历而且即使中间有nil也能完整遍历到最后呢? 接下来就说这个:通过maxSize = table.maxn(pTable)获取到table最后一个元素的所在位置(或理解为最大长度,包括其中的nil),然后: for idx=1, maxSize do if pTable[i

lua table remove元素的问题

当我在工作中使用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的差集(只支持一维table) 1.lua table 判空: table 判空,用的了next()函数. next()函数说明:运行程序来遍历表中的所有域. 第一个参数是要遍历的表,第二个参数是表中的某个键. next 返回该键的下一个键及其关联的值. 如果用 nil 作为 第二个参数调用 next 将返回初始键及其关联值. 当以最后一个键去调用,或是以 nil 调用一张空表时, next 返回 nil. 如果不提供第二个参数,将认为它就是 nil. 可以用 ne

lua table integer index 特性

table.maxn (table) Returns the largest positive numerical index of the given table, or zero if the table has no positive numerical indices. (To do its job this function does a linear traversal of the whole table.) 返回表中最大的正数值index. 说明: 1. 此接口不是统计表中元素的

Lua table pair和ipair区别

官方描述: ipairs (t) Returns three values: an iterator function, the table t, and 0, so that the construction for i,v in ipairs(t) do body end will iterate over the pairs (1,t[1]), (2,t[2]), ···, up to the first integer key absent from the table. pairs (

Lua Table 操作

Lua中table类似与C#种的字典,其实就是一个key-value键值对数据结构.来学习下table基本操作 Table的创建 myTable = {} --表名后面使用{}赋值,表示一个空的表 myTable = {name="盘子脸",age=18,isMan=true} --创建时候就添加键-值 myTable = {10,20,30,"plateface"} --创建数字下标值的table,默认是从1开始 Table的赋值 myTable[3] = 34

(转) 关于lua table是否为空的判断

在项目的脚本lua中经常有这样的需求, 1.local a = {} 2.对a进行处理 3.对a是否为空表进行判断 关于对a是否为空表的判断,我发现有些代码如此做: if a == {} then 这样的结果就是a == {}永远返回false,是一个逻辑错误.因为这里比较的是table a和一个匿名table的内存地址. 也有些代码如此做: if table.maxn(a) == 0 then 这样做也不保险,除非table的key都是数字,而没有hash部分. 难道真的要遍历table发现有