按Lua中的值关联排序表

Ben*_*ank 20 sorting lua asort lua-table

我有一个key => value表我想在Lua中排序.键都是整数,但不是连续的(并且有意义).Lua唯一的排序函数似乎是table.sort,它将表视为简单数组,丢弃原始密钥及其与特定项的关联.相反,我基本上希望能够使用PHP的asort()功能.

是)我有的:

items = {
    [1004] = "foo",
    [1234] = "bar",
    [3188] = "baz",
    [7007] = "quux",
}
Run Code Online (Sandbox Code Playgroud)

排序操作后我想要的是:

items = {
    [1234] = "bar",
    [3188] = "baz",
    [1004] = "foo",
    [7007] = "quux",
}
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

编辑:根据答案,我将假设它只是我正在使用的特定嵌入式Lua解释器的一个奇怪的怪癖,但在我的所有测试中,pairs()总是按照它们被添加到的顺序返回表项桌子.(即上述两个声明将以不同方式迭代).

不幸的是,因为这不是正常的行为,看起来我无法得到我需要的东西; Lua没有内置的必要工具(当然),嵌入式环境对我来说太有限了.

不过,谢谢你的帮助!

Kor*_*icz 37

你似乎误解了一些东西.你在这里有一个关联数组.关联数组对它们没有明确的顺序,例如它只是对它们进行排序的内部表示(通常是排序的).

简而言之 - 在Lua中,您发布的两个阵列都是相同的.

您想要的是这样的表示:

items = {
    {1004, "foo"},
    {1234, "bar"},
    {3188, "baz"},
    {7007, "quux"},
}
Run Code Online (Sandbox Code Playgroud)

虽然您现在无法通过索引获取它们(它们被索引为1,2,3,4,但您可以创建另一个索引数组),但您可以使用它们对它们进行排序table.sort.

然后排序功能:

function compare(a,b)
  return a[1] < b[1]
end

table.sort(items, compare)
Run Code Online (Sandbox Code Playgroud)

  • 顺便说一句,`返回a [0] <b [0]`也是我的位数太多了.Lua索引是从1开始的. (6认同)
  • 对以哈希顺序返回数据 - 它可能是稳定的 - 但它不是添加项的顺序.来自lua-users wiki"注意,无法保证在使用字典时将密钥存储在表中的顺序,因此无法保证使用pair()检索密钥的顺序.此警告甚至适用于索引表的一部分,或者根本没有用作字典的表,只有索引作为键." (4认同)
  • 根据我的测试,Lua 似乎并非如此。当使用“pairs()”迭代表时,顺序是稳定的,并且与添加项目的顺序相对应。此外,我无法选择更改数据的存储方式;我将结果输入到第三方库中,该库以“pairs() order”向用户显示项目。 (2认同)
  • 我怀疑你会找到改变订单的方法 - 这是一个代表问题...... (2认同)
  • 既然我们要比较字符串,那么不应该是“return a[2] &lt; b[2]”吗? (2认同)

Kar*_*arl 8

正如Komel所说,你正在处理关联数组,这些数组没有保证排序.

如果您希望基于其关联值进行键排序,同时还要保留关联数组功能,则可以执行以下操作:

function getKeysSortedByValue(tbl, sortFunction)
  local keys = {}
  for key in pairs(tbl) do
    table.insert(keys, key)
  end

  table.sort(keys, function(a, b)
    return sortFunction(tbl[a], tbl[b])
  end)

  return keys
end

items = {
    [1004] = "foo",
    [1234] = "bar",
    [3188] = "baz",
    [7007] = "quux",
}

local sortedKeys = getKeysSortedByValue(items, function(a, b) return a < b end)
Run Code Online (Sandbox Code Playgroud)

sortedKeys是{1234,3188,1004,7007},您可以像这样访问您的数据:

for _, key in ipairs(sortedKeys) do
  print(key, items[key])
end
Run Code Online (Sandbox Code Playgroud)

结果:

1234     bar     
3188     baz     
1004     foo     
7007     quux    
Run Code Online (Sandbox Code Playgroud)


syl*_*aar 6

嗯,错过了关于无法控制迭代的部分.那里

但在卢阿,通常总会有一种方式.

http://lua-users.org/wiki/OrderedAssociativeTable

这是一个开始.现在您需要替换库使用的pair().这可能是对象= my_pairs.然后,您可以使用上面链接中的解决方案