如何根据 Lua 中的值对 table 进行排序?
How to sort a table by its values in Lua?
我有一个 table 由 key/value 对组成:
mytable[a] = 1,
mytable[b] = 4,
mytable[r] = 7,
mytable[f] = 2,
等等
我想按数字对 table 进行排序。所以我希望 table 是 {(a, 1), (f, 2), (b, 4), (r, 7)}
我试过使用
table.sort(mytable, function(a, b) return a[2] > b[2] end)
但这似乎没有用...
谢谢
A table 要么是一组 key/value 对,要么是一个数组。好吧,这不完全正确; table 可以是两者,但 key/value 条目与数组条目没有关系。也就是说,你可以这样做:
tbl = {
['a'] = 1,
['b'] = 4,
[1] = {'a', 1},
[2] = {'b', 4},
}
tbl[2]
与 tbl['b']
没有直接关系。可以执行tbl[2] = <anything>
,对tbl['b']
的内容没有影响。
只要 table 不变,您可以采用任何纯 key/value table 并构建它的数组部分,然后您可以根据需要对其进行排序.这是一个函数:
local function build_array(tbl)
--We cannot modify `tbl` while iterating through it, so build a temp array.
local arr = {}
for key, value in pairs(tbl) do
arr[#arr + 1] = {key, value}
end
for ix, value in ipairs(arr) do
tbl[ix] = value
end
return tbl
end
"Programming Lua"中建议的一种方法(我不记得具体在哪里)是将键提取到一个单独的序列中,然后对序列进行排序,并使用生成的排序序列索引到原文table。示例:
keys = {}
for key, _ in pairs(mytable) do
table.insert(keys, key)
end
table.sort(keys, function(keyLhs, keyRhs) return mytable[keyLhs] < mytable[keyRhs] end)
然后您可以遍历键以检索相应的值:
for _, key in ipairs(keys) do
print(key, mytable[key])
end
我有一个 table 由 key/value 对组成:
mytable[a] = 1,
mytable[b] = 4,
mytable[r] = 7,
mytable[f] = 2,
等等
我想按数字对 table 进行排序。所以我希望 table 是 {(a, 1), (f, 2), (b, 4), (r, 7)} 我试过使用
table.sort(mytable, function(a, b) return a[2] > b[2] end)
但这似乎没有用... 谢谢
A table 要么是一组 key/value 对,要么是一个数组。好吧,这不完全正确; table 可以是两者,但 key/value 条目与数组条目没有关系。也就是说,你可以这样做:
tbl = {
['a'] = 1,
['b'] = 4,
[1] = {'a', 1},
[2] = {'b', 4},
}
tbl[2]
与 tbl['b']
没有直接关系。可以执行tbl[2] = <anything>
,对tbl['b']
的内容没有影响。
只要 table 不变,您可以采用任何纯 key/value table 并构建它的数组部分,然后您可以根据需要对其进行排序.这是一个函数:
local function build_array(tbl)
--We cannot modify `tbl` while iterating through it, so build a temp array.
local arr = {}
for key, value in pairs(tbl) do
arr[#arr + 1] = {key, value}
end
for ix, value in ipairs(arr) do
tbl[ix] = value
end
return tbl
end
"Programming Lua"中建议的一种方法(我不记得具体在哪里)是将键提取到一个单独的序列中,然后对序列进行排序,并使用生成的排序序列索引到原文table。示例:
keys = {}
for key, _ in pairs(mytable) do
table.insert(keys, key)
end
table.sort(keys, function(keyLhs, keyRhs) return mytable[keyLhs] < mytable[keyRhs] end)
然后您可以遍历键以检索相应的值:
for _, key in ipairs(keys) do
print(key, mytable[key])
end