我有一个键=>值表,我想在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没有内置必要的工具(当然),并且嵌入式环境太有限,我无法解决。
尽管如此,还是谢谢您的帮助!
您似乎误会了一些东西。您在这里拥有的是一个关联数组。关联数组没有明确的顺序,例如,只有内部表示形式(通常是排序的)才能对它们进行排序。
简而言之-在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)
根据我的测试,这对于Lua似乎并非如此。使用遍历表时
pairs()
,顺序是稳定的,并且与项目添加的顺序相对应。此外,我没有选择更改数据存储方式的选择;我将结果输入第3方库,该库按“pairs()
顺序” 向用户显示项目。对以散列顺序返回数据-可能是稳定的-但不是项目添加的顺序。来自lua-users wiki的“注意,不能保证使用字典时键在表中的存储顺序,因此不能保证使用pair()检索键的顺序。此警告甚至适用于索引表的一部分,或根本不用作字典的表,而仅以索引作为键。”
顺便说一句,
return a[0] < b[0]
我也咬了我太多遍了。Lua索引基于1。@Stavros-天哪,太奇怪了,以至于任何人都花了很长时间才注意到它!
既然我们要比较字符串,不是
return a[2] < b[2]
吗?