24

我有一个键 => 值表,我想在 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()总是按照它们添加到的顺序返回表项桌子。(即上述两个声明会以不同的方式迭代)。

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

不过,谢谢大家的帮助!

4

6 回答 6

40

你似乎误会了什么。你这里有一个关联数组。关联数组对它们没有明确的顺序,例如,它只是对它们进行排序的内部表示(通常是排序的)。

简而言之 - 在 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)
于 2010-01-10T20:17:59.427 回答
12

正如 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    
于 2014-07-04T02:16:44.827 回答
6

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

但在 lua 中,通常总有办法。

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

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

于 2010-01-10T20:57:32.940 回答
3

PHP 数组与 Lua 表不同。

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

  • Lua 表总是包含一组无序的键值对。

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

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

NB Lua 允许您在同一个表中将连续整数键与任何其他类型的键混合在一起——并且表示是有效的。我有时会使用这个特性,通常是用一些元数据来标记一个数组。

于 2010-01-11T03:46:21.663 回答
3

几个月后,带着同样的疑问来到这里。推荐的答案似乎指出了所需的内容与在 LUA 中的外观之间的差距,但它并没有让我得到我想要的东西:- 这是一个按密钥排序的哈希。

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

于 2011-05-12T12:15:17.450 回答
1

几年前我做了一点 Lua 编码,但我不再流利了。

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

我不知道可以使用 Kornel Kisielewicz 推荐的方法对数组进行排序。

于 2010-01-10T20:48:41.297 回答