问题标签:

  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. 途牛与十八好汉撕X又言和 到底想干啥?

    到底想干啥?" title="途牛与十八好汉撕X又言和 到底想干啥?"> 天下大势,合久必分,分久必合.很多看起来热闹哄哄的"劳燕分飞"事件,最 ...

  2. <USACO09FEB>庙会捷运Fair Shuttleの思路

    一个没有被我成功证明的 贪心 但是 ac了的 别人排序都是排终点.但我的排终点错了emm排起点才对qvq 有没有人友情看看怎么证(没有 #include<cstdio> #include& ...

  3. 几种 npm install XXX 的区别

    在使用npm命令安装资源包时,有哪些需要注意的区别 npm install X 会把X包安装到node_modules目录中 不会修改package.json 之后运行npm install命令时,不 ...

  4. 机器学习Week3

    分类问题(classification problems) y=0 or 1 回归分析/逻辑分析(logistic regression): 目标:令h(x)位于[0,1]之间 逻辑函数/S型函数: ...

  5. PHP的ArrayAccess接口介绍

    在 PHP5 中多了一系列新接口.在 HaoHappy 翻译的你可以了解到他们的应用.同时这些接口和一些实现的 Class 被归为 Standard PHP Library(SPL).在 PHP5 中 ...

  6. Ueditor富文本编辑器--Ctrl V 粘贴后原有图片显示错误

    最近负责将公司官网从静态网站改版成动态网站,方便公司推广营销人员修改增加文案,避免官网文案维护过于依赖技术人员.在做后台管理系统时用到了富文本编辑器Ueditor,因为公司有一个阿里云文件资源服务器, ...

  7. 一文看懂Java序列化

    一文看懂Java序列化 简介 Java实现 Serializable 最基本情况 类的成员为引用 同一对象多次序列化 子父类引用序列化 可自定义的可序列化 Externalizable:强制自定义序列 ...

  8. 使用 EOLINKER 进行接口测试的最佳路径 (上)

    本文内容: 测试脚本管理:讲述如何在 EOLINKER 上设计测试项目目录结构. 编写测试脚本:讲述如何在 EOLINKER 上编写接口测试脚本. 测试脚本执行及报告:讲述如何在 EOLINKER 上 ...

  9. 前端每日实战:149# 视频演示如何用纯 CSS 创作一个宝路薄荷糖的动画

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/oagrvz 可交互视频 此视频是可 ...

  10. Layabox UI 笔记

    1.UI List  官方文档是 https://ldc2.layabox.com/doc/?language=zh&nav=zh-js-3-3-7 通常用List的时候会出现滚动条按钮比例拉 ...