按Lua中的值关联排序表

时间:2010-01-10 20:09:35

标签: sorting lua lua-table asort

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

我有什么:

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

排序操作后我想要的是什么:

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

有什么想法吗?

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

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

仍然,谢谢你的帮助,全部!

6 个答案:

答案 0 :(得分:36)

你似乎误解了一些事情。你在这里有associative array。关联数组对它们没有明确的顺序,例如它只是命令它们的内部表示(通常是排序的)。

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

你想要的是这样的代表:

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

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

然后是排序功能:

table.sort

答案 1 :(得分: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)

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

for _, key in ipairs(sortedKeys) do
  print(key, items[key])
end

结果:

1234     bar     
3188     baz     
1004     foo     
7007     quux    

答案 2 :(得分:6)

嗯,错过了关于无法控制迭代的部分。有

但是在lua中通常总会有一种方式。

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

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

答案 3 :(得分:3)

PHP数组与Lua表不同。

  • PHP数组可能包含键值对的有序列表

  • Lua表始终包含无序集合键值对。

当程序员选择使用整数1,2,3 ......作为键时,Lua表充当数组。语言语法和标准库函数(如table.sort)为具有连续整数键的表提供特殊支持。

因此,如果要模拟PHP数组,则必须使用键值对列表来表示它,这实际上是表的表,但将其视为键列表更有帮助 - 值对。将自定义的“小于”功能传递给table.sort,您将全部设定。

N.B。 Lua允许您混合连续整数键与相同表中的任何其他类型的键 - 并且表示效率很高。我有时会使用此功能,通常用一些元数据来标记数组。

答案 4 :(得分:3)

几个月后,以相同的查询来到这里。推荐的答案似乎确定了所需要的内容与LUA中的外观之间的差距,但它并没有让我得到我的意思: - 这是一个按键排序的哈希。

此页面上的前三个功能DID:http://lua-users.org/wiki/SortedIteration

答案 5 :(得分:1)

几年前我做了一段简短的Lua编码,但我不再流利了。

当遇到类似的问题时,我将我的数组复制到另一个数组,其中键和值反转,然后在新数组上使用sort

我不知道有可能使用Kornel Kisielewicz建议的方法对数组进行排序。