我有一个 Lua 表,我正在尝试对其进行排序。表格格式如下:
tableOfKills[PlayerName] = NumberOfKills
这意味着,例如,如果我有一个名为 Robin 的玩家总共击杀 8 次,另一个名为 Jon 的玩家总共击杀 10 次,那么表格将是:
tableOfKills[Robin] = 8
tableOfKills[Jon] = 10
我如何对这种类型的表格进行排序以首先显示最高的击杀数?预先感谢!
Lua 中的表是一组具有唯一键的键值映射。这些对以任意顺序存储,因此表不以任何方式排序。
您可以做的是按某种顺序迭代表格。基本的
pairs
无法保证访问键的顺序。这是 pairs
的自定义版本,我将其称为 spairs
,因为它按排序顺序迭代表:
function spairs(t, order)
-- collect the keys
local keys = {}
for k in pairs(t) do keys[#keys+1] = k end
-- if order function given, sort by it by passing the table and keys a, b,
-- otherwise just sort the keys
if order then
table.sort(keys, function(a,b) return order(t, a, b) end)
else
table.sort(keys)
end
-- return the iterator function
local i = 0
return function()
i = i + 1
if keys[i] then
return keys[i], t[keys[i]]
end
end
end
以下是该函数的使用示例:
HighScore = { Robin = 8, Jon = 10, Max = 11 }
-- basic usage, just sort by the keys
for k,v in spairs(HighScore) do
print(k,v)
end
--> Jon 10
--> Max 11
--> Robin 8
-- this uses an custom sorting function ordering by score descending
for k,v in spairs(HighScore, function(t,a,b) return t[b] < t[a] end) do
print(k,v)
end
--> Max 11
--> Jon 10
--> Robin 8
避免迭代器的另一种排序方法是将表传递给键值对列表(即:list = {{k1,v1}, {k2, v2}, ...}。这是我的解决方案:
local ranks = {}
for player,kills in pairs(tableOfKills) do
table.insert(ranks, {player, kills})
end
-- Now we use Lua's built-in sort function with a short custom comparator function:
table.sort(ranks, function (a, b) return a[2] > b[2] end)
-- The only thing left to do is display the results:
for i=1,#ranks do
print(ranks[i][1], ranks[i][2])
end
Ethan 的上述替代方法效果很好。 我无法发表评论(还没有声誉),但我必须告诉你。