【问题标题】:lua 5.2 changes the order of elements in the tablelua 5.2 改变表格中元素的顺序
【发布时间】:2012-08-12 01:57:33
【问题描述】:

在 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 时会出现此错误?

【问题讨论】:

    标签: dictionary lua lua-table


    【解决方案1】:

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

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

    请注意,许多编程语言的基于散列的结构(Lua 表是)不保证其值的任何特定(插入)顺序。

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

    【讨论】:

      【解决方案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
      

      【讨论】:

        【解决方案3】:

        Lua 5.2.1 为散列引入了一些随机化种子。

        【讨论】:

          猜你喜欢
          • 2011-12-06
          • 1970-01-01
          • 2023-04-04
          • 1970-01-01
          • 2021-10-21
          • 1970-01-01
          • 1970-01-01
          • 2017-09-19
          • 1970-01-01
          相关资源
          最近更新 更多