LUA 5.2改变表元素的顺序(lua 5.2 changes the order of eleme

2019-09-21 06:25发布

在LUA 5.1的代码:

sums = { 
    ["LD1"] = { }, 
    ["LD2"] = { }, 
    ["LD3"] = { }, 
    ["LD4"] = { }, 
    ["I1"] = { }, 
    ["I2"] = { }, 
    ["I3"] = { }
}

for fld = 1, 22, 1 do
    table.insert( sums["LD1"] , 0 );
    table.insert( sums["LD2"] , 0 );
    table.insert( sums["LD3"] , 0 );
    table.insert( sums["LD4"] , 0 );
    table.insert( sums["I1"] , 0 );
    table.insert( sums["I2"] , 0 );
    table.insert( sums["I3"] , 0 );
end

for i,O in pairs(sums) do
    print(i)
end

显示顺序:

(第一执行)

LD1
LD2
LD3
LD4
I1
I2
I3

(第二执行)

LD1
LD2
LD3
LD4
I1
I2
I3

在Lua 5.2,该序列被呈现以随机顺序:

(第一执行)

I1
I2
LD4
I3
LD1
LD2
LD3

(第二执行)

LD2
LD3
LD4
I3
I1
I2
LD1

为什么当我用LUA 5.2这个错误发生?

Answer 1:

Lua的5.2.1推出了种子的一些随机的散列。



Answer 2:

两者的Lua 5.1和5.2提及在下面的next功能 (其pairs函数使用):

其中指数枚举的顺序没有规定,即使是数字索引。

需要注意的是很多编程语言基于散列的结构(其中的Lua表 )不保证其数值的任何具体(插入)命令。

换句话说:这不是错误。 你不应该指望在表插入的元素的任何特定的顺序。 你可以期待的唯一的顺序是,当你使用数字作为键,并使用ipairs功能 ,这将遍历对( 1,t[1] 2,t[2] ... ,同比增长在第一个整数键从表中缺席。



Answer 3:

没有指定以表的元素。

你需要创建一个数字指标映射到特定的子表的表sums 。 你甚至可以使用的sums表来保存你的两个子表,你的排序他们。

例如:

-- create table with sum ids in a specific order
sums = { "LD1", "LD2", "LD3", "LD4", "I1", "I2", "I3" }

-- create subtables in sums for each id
for i,id in ipairs(sums) do
    sums[id] = {}
end

-- stick some data in the sum tables
for fld = 1, 22 do
    table.insert( sums["LD1"] , 0 );
    table.insert( sums["LD2"] , 0 );
    table.insert( sums["LD3"] , 0 );
    table.insert( sums["LD4"] , 0 );
    table.insert( sums["I1"] , 0 );
    table.insert( sums["I2"] , 0 );
    table.insert( sums["I3"] , 0 );
end

-- show sum tables in order
for i,id in ipairs(sums) do
    print(id, sums[id])
end


文章来源: lua 5.2 changes the order of elements in the table