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",

    [10] = "1",
    [20] = "1",
    [30] = "1",
    [40] = "1",
    [50] = "1",

    [11] = "1",
    [12] = "1",
    [13] = "1",
    q = "1",
    [14] = "1",
    w = "1",
    [15] = "1",
    e = "1",
    r = "1",
    t = "1",
    y = "1",
}

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

我们通常认为:输出结果会是先顺序输出12345,再乱序输出其它

但是恰巧 在lua 5.1.5 都是乱序

经测试在lua 5.1.5,如果想与通常认为相符,那么就不能显示指定索引值,只能隐式指定索引值,就是把上述table改成这样:

T = {
    "1",
    "1",
    "1",
    "1",
    "1",

    [10] = "1",
    [20] = "1",
    [30] = "1",
    [40] = "1",
    [50] = "1",

    [11] = "1",
    [12] = "1",
    [13] = "1",
    q = "1",
    [14] = "1",
    w = "1",
    [15] = "1",
    e = "1",
    r = "1",
    t = "1",
    y = "1",
}

但是这种解决办法,显然让人无法接受,让人窒息.所以今天研究了一下解决办法

目标:

  使用迭代器输出Table时,首先顺序输出数字索引(允许数字索引间断),最后输出字符串索引

问题解决:

  灵感来源于<Programming In Lua>中的代码:

function pairsByKeys(t)
    local a = {}

    for n in pairs(t) do
        a[#a + 1] = n
    end

    table.sort(a)

    local i = 0

    return function()
        i = i + 1
        return a[i], t[a[i]]
    end
end

for key, value in pairsByKeys(表) do      

end 

  但是这个还差点意思,当table中包含字符串索引时,会报错.我们期望能和pairs一样兼容字符串索引.我们强化一下,如下:

function spairs(t)
    local num_key_table = {}
    local string_key_table = {}

    for k,v in pairs(t) do
        if type(k) == "number" then
            num_key_table[#num_key_table + 1] = k
        else
            string_key_table[k] = v
        end
    end

    table.sort(num_key_table)

    local i = 0

    return function()
        if  i < #num_key_table then
            i = i + 1
            return num_key_table[i], t[num_key_table[i]]
        else
            for k,v in pairs(string_key_table) do
                string_key_table[k] = nil
                return k,v
            end
        end
    end
end

for k,v in spairs(T) do
    print(k)
end

对比:

还有改进的地方,欢迎指导

原文地址:https://www.cnblogs.com/Lenots/p/12566794.html

时间: 2024-10-15 14:58:02

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

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 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 中pairs和ipairs 区别

lua 中pairs 和 ipairs区别 标准库提供了集中迭代器,包括迭代文件每行的(io.lines),迭代table元素的(pairs),迭代数组元素的(ipairs),迭代字符串中单词的 (string.gmatch)等等.LUA手册中对与pairs,ipairs解释如下: ipairs (t) Returns three values: an iterator function, the table t, and 0, so that the construction for i,v

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 的长度问题

直入主题 我们要取lua table的长度时习惯这样 local tb = {1,2,3,4} print(#tb) 这时候,输出理所当然的是4,如果在程序中我们需要判断长度时使用这样的方法,再看一下 tb[1] = nil print(#tb) 输出还是4,似乎有点背离我们的意愿 我们想知道这个table里面是不是有4个值,但是有一个值被置空了,输出结果却没有及时告诉我们 发生这样问题的原因是,lua在初始化table的时候,会给这个table分配值存储的空间,代码里面tb初始化包含4个数字值

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表

local print = print local tconcat = table.concat local tinsert = table.insert local srep = string.rep local type = type local pairs = pairs local tostring = tostring local next = next function print_lua_table (lua_table, indent) if not lua_table or t

(转) 关于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发现有

lua table 初识

  1 local demo = {"demoValue"} 2 local function fun() 3 print"hello world" 4 end 5 local tableDemo = { 6 ["a3132t"] = "valide?", 7 [9] = fun, 8 [fun] = "a funciton.", 9 ["demo"] = "anoter st