Dictionary Lua5.2更改了表中元素的顺序
在lua 5.1中,代码:Dictionary Lua5.2更改了表中元素的顺序,dictionary,lua,lua-table,Dictionary,Lua,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"]
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
显示顺序:
(第一次执行)
(第二次执行)
在lua 5.2中,序列以随机顺序呈现:
(第一次执行)
(第二次执行)
当我使用lua 5.2时为什么会发生此错误?lua 5.1和5.2在中都提到了以下内容(该函数使用了
对):
没有指定索引的枚举顺序,即使对于数字索引也是如此
请注意,许多编程语言的基于哈希的结构(Lua表是基于哈希的)不能保证其值的任何特定(插入)顺序
换句话说:这不是错误。您不应该期望表中插入元素的任何特定顺序。您可以期望的唯一顺序是使用数字作为键,并使用将在对(1,t[1]
)、(2,t[2]
)、…
)上迭代,直到表中缺少的第一个整数键。表中的元素没有指定顺序
您需要创建一个表,将数值索引映射到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.1引入了一些散列种子的随机化
LD1
LD2
LD3
LD4
I1
I2
I3
I1
I2
LD4
I3
LD1
LD2
LD3
LD2
LD3
LD4
I3
I1
I2
LD1
-- 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