lua 5.2更改表中元素的顺序

Sau*_*ral 4 lua dictionary lua-table

在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
Run Code Online (Sandbox Code Playgroud)

显示顺序:

(第一次执行)

LD1
LD2
LD3
LD4
I1
I2
I3
Run Code Online (Sandbox Code Playgroud)

(第二次执行)

LD1
LD2
LD3
LD4
I1
I2
I3
Run Code Online (Sandbox Code Playgroud)

在lua 5.2中,序列以随机顺序呈现:

(第一次执行)

I1
I2
LD4
I3
LD1
LD2
LD3
Run Code Online (Sandbox Code Playgroud)

(第二次执行)

LD2
LD3
LD4
I3
I1
I2
LD1
Run Code Online (Sandbox Code Playgroud)

为什么当我使用lua 5.2时会发生这个错误?

Bar*_*ers 5

Lua 5.1和5.2都在next函数中提到了以下内容(pairs函数使用):

未指定索引的枚举顺序,即使对于数字索引也是如此.

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

换句话说:这不是错误.您不应该期望表中插入元素的任何特定顺序.您可以预期的唯一顺序是当您使用数字作为键时,并使用将遍历对(),()的ipairs函数,直到表中不存在的第一个整数键.1,t[1]2,t[2]...


Mud*_*Mud 5

表的元素没有指定的顺序。

您需要创建一个表,将数字索引映射到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
Run Code Online (Sandbox Code Playgroud)


lhf*_*lhf 5

Lua 5.2.1引入了一些用于散列的种子随机化.