在 Lua 中按值对表进行关联排序
题
我有一个 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
。
我不知道的可能性使用科内尔·基利尔威奇斯建议的方法中的数组进行排序。