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

我拥有的:

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

排序操作后我想要什么:

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

有任何想法吗?

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

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

不过,还是谢谢大家的帮助!

有帮助吗?

解决方案

您似乎误解了什么。你在这里什么是关联数组。关联数组没有明确的顺序在他们身上,例如这只是内部表示(通常排序)是预定他们。

在短 - 在Lua,无论您发布的阵列的是的相同

你想什么,而不是,是这样的表示:

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

虽然不能由索引现在得到它们(它们被索引1,2,3,4,但可以创建另一个索引阵列),则可以使用table.sort对其进行排序。

一个排序函数会然后:

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

table.sort(items, compare)

其他提示

由于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    

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

但是,在LUA通常有总是一种方式。

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

那是一个开始。现在,你就需要更换(),该库使用对。这可能是一个simples成对= my_pairs。然后可以使用在链路中的溶液上方

PHP 数组与 Lua 表不同。

  • PHP 数组可能有一个 有序列表 键值对。

  • 一个 Lua 表总是包含一个 无序集 键值对。

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

因此,如果您想模拟 PHP 数组,则必须使用键值对列表来表示它,这实际上是一个表的表,但将其视为键值对列表会更有帮助。将自定义“小于”函数传递给 table.sort 然后一切就准备好了。

注意:Lua 允许你 混合 连续整数键与任何其他类型的键 相同的 表——并且表示是有效的。我有时会使用此功能,通常是用一些元数据来标记数组。

来这几个月后,与相同的查询。推荐答案似乎找准了什么要求和如何看起来LUA之间的差距,但它并没有得到我什么,我是后正好: - 这是由重点排序的散列

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

我做的Lua编码几年短暂位前,但我不再流利了。

当面临着类似的问题,我复制我的阵列与键和反转值另一个数组,然后使用新的阵列上sort

我不知道的可能性使用科内尔·基利尔威奇斯建议的方法中的数组进行排序。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top