Lua循环洗牌列表

我有一个问题,在我的脚本中,如果我尝试遍历我的列表,输出结果完全是随机洗牌的

最小代码:

list = {
    numbers = {
        number1 = 1,
        number2 = 2,
        number3 = 3,
        number4 = 4,
        number5 = 5,
        number6 = 6,
        number7 = 7,
    }
}

for k, numbers in pairs(list) do
    for k, number in pairs(numbers) do
        print(number)
    end
end

输出:

5
7
2
3
4
6
1

我想到的唯一修复方法是删除number1到number7这些变量,直接输入数字

原文链接 https://stackoverflow.com/questions/70584331

点赞
stackoverflow用户2858170
stackoverflow用户2858170

Lua 表没有顺序。

此外,您正在使用内部使用 nextpairs

根据 Lua 手册:

甚至对于数字索引,都未指定索引枚举的顺序。(要按数字顺序遍历表,请使用数字for。)

在您的情况下,键具有数字组件,因此可以简单地在数字循环中创建它们。

local numbers = {
        number1 = 1,
        number2 = 2,
        number3 = 3,
        number4 = 4,
        number5 = 5,
        number6 = 6,
        number7 = 7,
    }

for i = 1, 7 do
  print(numbers["number"..i])
end

对于其他非数字键,您必须使用第二个列出有序序列的表:

local numbers = { bob = 1, bill = 3, john = 2}
local orderedKeys = { "bob", "john", "bill"}

for k,v in ipairs(orderedKeys) do
  print(numbers[v])
end

数字循环将始终适用于任何整数键。

local numbers = {
  [0] = 0,
  [5] = 5,
  [3] = 3,
  [1] = 0,
}

for i = 0, 5 do
  if numbers[i] then
    print(numbers[i])
  end
end

仔细阅读以下内容:

恰好有一条边框的表称为序列。例如,表 {10, 20, 30, 40, 50} 是序列,因为它只有一个边框(5)。表 {10, 20, 30, nil, 50} 有两个边框(3 和 5),因此它不是序列。(在索引4处的nil称为空隙。)表 {nil, 20, 30, nil, nil, 60, nil} 有三个边框(0、3 和 6)和三个空隙(在索引1、4 和 5处),因此它也不是序列。表 {} 是带有边框0的序列。请注意,非自然键不会影响表是否为序列。

ipairs、长度运算符 table.sorttable.concat 等这样的东西仅适用于序列。

不贡献于序列的键将被这些函数忽略。您只能使用next或pairs分别循环遍历表中的所有键。但是,顺序不能保证。

2022-01-04 21:49:27