我有一个键=>值表我想在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没有内置的必要工具(当然),嵌入式环境对我来说太有限了。
仍然,谢谢你的帮助,全部!
答案 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建议的方法对数组进行排序。