Ben*_*ank 20 sorting lua asort lua-table
我有一个key => value表我想在Lua中排序.键都是整数,但不是连续的(并且有意义).Lua唯一的排序函数似乎是table.sort,它将表视为简单数组,丢弃原始密钥及其与特定项的关联.相反,我基本上希望能够使用PHP的asort()功能.
是)我有的:
items = {
[1004] = "foo",
[1234] = "bar",
[3188] = "baz",
[7007] = "quux",
}
Run Code Online (Sandbox Code Playgroud)
排序操作后我想要的是:
items = {
[1234] = "bar",
[3188] = "baz",
[1004] = "foo",
[7007] = "quux",
}
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
编辑:根据答案,我将假设它只是我正在使用的特定嵌入式Lua解释器的一个奇怪的怪癖,但在我的所有测试中,pairs()总是按照它们被添加到的顺序返回表项桌子.(即上述两个声明将以不同方式迭代).
不幸的是,因为这不是正常的行为,看起来我无法得到我需要的东西; Lua没有内置的必要工具(当然),嵌入式环境对我来说太有限了.
不过,谢谢你的帮助!
Kor*_*icz 37
你似乎误解了一些东西.你在这里有一个关联数组.关联数组对它们没有明确的顺序,例如它只是对它们进行排序的内部表示(通常是排序的).
简而言之 - 在Lua中,您发布的两个阵列都是相同的.
您想要的是这样的表示:
items = {
{1004, "foo"},
{1234, "bar"},
{3188, "baz"},
{7007, "quux"},
}
Run Code Online (Sandbox Code Playgroud)
虽然您现在无法通过索引获取它们(它们被索引为1,2,3,4,但您可以创建另一个索引数组),但您可以使用它们对它们进行排序table.sort.
然后排序功能:
function compare(a,b)
return a[1] < b[1]
end
table.sort(items, compare)
Run Code Online (Sandbox Code Playgroud)
正如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)
Run Code Online (Sandbox Code Playgroud)
sortedKeys是{1234,3188,1004,7007},您可以像这样访问您的数据:
for _, key in ipairs(sortedKeys) do
print(key, items[key])
end
Run Code Online (Sandbox Code Playgroud)
结果:
1234 bar
3188 baz
1004 foo
7007 quux
Run Code Online (Sandbox Code Playgroud)
嗯,错过了关于无法控制迭代的部分.那里
但在卢阿,通常总会有一种方式.
http://lua-users.org/wiki/OrderedAssociativeTable
这是一个开始.现在您需要替换库使用的pair().这可能是对象= my_pairs.然后,您可以使用上面链接中的解决方案
| 归档时间: |
|
| 查看次数: |
37520 次 |
| 最近记录: |