问题标签:

  Lua table pairs;Lua table 迭代器;Lua table 遍历顺序;Lua table 数字索引 字符串索引;

问题背景:

  使用pairs输出table时,当一部分数字索引连续时,我们通常认为这一部分会按顺序遍历.

  实际情况是在低版本Lua中不按顺序遍历,而高版本Lua中却会按顺序遍历.造成了版本差异,与通常认知不相符.

  例如使用pairs输出如下table

T = {
[] = "",
[] = "",
[] = "",
[] = "",
[] = "", [] = "",
[] = "",
[] = "",
[] = "",
[] = "", [] = "",
[] = "",
[] = "",
q = "",
[] = "",
w = "",
[] = "",
e = "",
r = "",
t = "",
y = "",
} for k,v in pairs(T) do
print(k)
end

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

但是恰巧 在lua 5.1.5 都是乱序

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

T = {
"",
"",
"",
"",
"", [] = "",
[] = "",
[] = "",
[] = "",
[] = "", [] = "",
[] = "",
[] = "",
q = "",
[] = "",
w = "",
[] = "",
e = "",
r = "",
t = "",
y = "",
}

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

目标:

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

问题解决:

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

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(表) 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 + ] = k
else
string_key_table[k] = v
end
end table.sort(num_key_table) local i = return function()
if i < #num_key_table then
i = i +
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

5.27 修改:

function spairs(t)
local num_key_table = {}
local str_key_table = {}
for k,v in pairs(t) do
if type(k) == "number" then
num_key_table[#num_key_table + ] = k
else
str_key_table[#str_key_table + ] = k
end
end table.sort(num_key_table) local num_index =
local str_index =
return function()
if num_index < #num_key_table then
num_index = num_index +
return num_key_table[num_index], t[num_key_table[num_index]]
elseif str_index < #str_key_table then
str_index = str_index +
return str_key_table[str_index], t[str_key_table[str_index]]
end
end
end

对比:

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

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

  1. lua table remove元素的问题

    当我在工作中使用lua进行开发时,发现在lua中有4种方式遍历一个table,当然,从本质上来说其实都一样,只是形式不同,这四种方式分别是: for key, value in pairs(tbtes ...

  2. Lua table笔记

    记录我在使用lua的过程中的一些笔记 默认key为数字递增 local tb={"A",[3]="C","B"} 这个tb通过下标1,2,3 ...

  3. lua中pairs 和 ipairs 的区别

    1.table中存储值的时候,是按照顺序存储的,存储 k-v 的时候,是按照 k 的哈希值存储的. 2.ipairs --- 只能输出 table 中的值,并且不可输出nil,遇到 ni l就退出 p ...

  4. Lua 学习之基础篇四<Lua table(表)>

    table 是 Lua 的一种数据结构用来帮助我们创建不同的数据类型,如:数组.字典等. Lua table 使用关联型数组,你可以用任意类型的值来作数组的索引,但这个值不能是 nil. Lua ta ...

  5. Lua中 pairs和ipairs的区别

    Lua系列–pairs和ipairsLua中Table的存储方式在看二者的区别之前,我们首先来看一下Lua中的table是如何在内存中进行分配的.Table的组成:1.哈希表 用来存储Key-Valu ...

  6. lua中pairs和ipairs的区别

    标准库提供了集中迭代器,包括迭代文件每行的(io.lines),迭代table元素的(pairs),迭代数组元素的(ipairs),迭代字符串中单词的 (string.gmatch)等等.LUA手册中 ...

  7. lua 中pairs 和 ipairs区别

    lua 中pairs 和 ipairs区别 标准库提供了集中迭代器,包括迭代文件每行的(io.lines),迭代table元素的(pairs),迭代数组元素的(ipairs),迭代字符串中单词的 (s ...

  8. Lua table pair和ipair区别

    官方描述: ipairs (t) Returns three values: an iterator function, the table t, and 0, so that the constru ...

  9. Lua table使用

    days = {"Sunday", "Monday", "Tuesday", "Wednesday", "Th ...

随机推荐

  1. 算法设计与分析-Week12

    题目描述 You are given coins of different denominations and a total amount of money amount. Write a func ...

  2. 这是100年后火星的未来,到处都是CBD!

    ​火星是个荒漠之地,尽管如此,最近几十年人类一直准备登录火星,然后殖民火星.随着科技的迅猛发展,感觉火星离我们越来越近了.不过,人类如何在火星上生存下去,这一直是科学家们最热衷的话题. ​意大利建筑师 ...

  3. POI之下载模板(或各种文件)

    该例基于Nutz框架 前台代码: <a href="" id="errordownload" onclick="downloadErrorLog ...

  4. 【01】React 环境搭建

    react来自于Facebook公司的开源项目 react 组件化模块化  开发模式 react通过对DOM的模拟(虚拟dom),最大限度地减少与DOM的交互  (数据绑定) react 基于jsx的 ...

  5. Vue的fetch的概述和使用

    Fetch基本概念 (前端小白,刚学习vue,写的不好或是不对,请各位大佬多多指正!感激不尽!) Fetch 是一个现代的概念, 等同于 XMLHttpRequest.它提供了许多与XMLHttpRe ...

  6. http协议入门---转载

    http协议入门 ##(一). HTTP/0.9 HTTP 是基于 TCP/IP 协议的应用层协议.它不涉及数据包(packet)传输,主要规定了客户端和服务器之间的通信格式,默认使用80端口. 最早 ...

  7. Python 将两个绝对路径拼接

    import os def two_abs_join(abs1, abs2): """ 将 绝对路径将两个绝对路径拼接, 就是将第二个的开路径(windows 的 C, ...

  8. JavaScript(5)--- 面向对象 + 原型

    面向对象 + 原型 面向对象这个概念并不陌生,如 C++.Java 都是面向对象语言.面向对象而言都会现有一个类的概念 ,先有类再有对象.类是实例的类型模板. 比如人类 是一个类 张三 李四 就是一个 ...

  9. 开发项目是Integer 与int 什么时候用

    什么时候用Integer : 如果该属性所对应的数据库的字段是主键或者是外键时,用Integer:因为Integer的默认值为null,数据库的主键或者外键不能为空,但是可以为null 什么时候用in ...

  10. ajax+lazyload时lazyload失效问题及解决

    最近写公司的项目的时候遇到一个关于图片加载的问题,所做的页面是一个商城的商品列表页,其中需要显示商品图片,名称等信息,因为商品列表可能会很长,所以其中图片需要滑到可以显示的区域再进行加载. 首先我的图 ...