在Lua中对表格[]排序

我有一个 Lua 表格,想要对其进行排序。该表格的格式如下:

tableOfKills[PlayerName] = NumberOfKills

这意味着,例如,如果我有一个名为 Robin 的玩家,他总共有 8 次击杀,另一个名为 Jon 的玩家,他总共有 10 次击杀,那么表格将是:

tableOfKills[Robin] = 8
tableOfKills[Jon]   = 10

我该如何对这种类型的表格进行排序以显示最高击杀数?谢谢!

点赞
用户221509
用户221509

Lua中的table是一组具有唯一键的键值映射。这些对是以任意顺序存储的,因此表格没有任何排序方式。

你可以按照某个顺序迭代表中的数据。基本的pairs不能保证被访问的键的顺序。这里是一个自定义版本的pairs,叫做spairs,因为它按排序顺序迭代表:

function spairs(t, order)
    -- 收集键
    local keys = {}
    for k in pairs(t) do keys[#keys+1] = k end

    -- 如果提供了排序函数,则通过将表和键传递给a、b,按照函数排序
    -- 否则只对键进行排序
    if order then
        table.sort(keys, function(a,b) return order(t, a, b) end)
    else
        table.sort(keys)
    end

    -- 返回迭代器函数
    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 }

-- 基本用法,按照键排序
for k,v in spairs(HighScore) do
    print(k,v)
end
--> Jon     10
--> Max     11
--> Robin   8

-- 这个例子使用了一个按照分数降序排序的自定义排序函数
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
2013-03-29 16:01:40
用户17647811
用户17647811

另一种不涉及迭代器等的排序方法是将表传递给键值对列表(即:list = {{k1,v1}, {k2, v2}, ...})。这是我的解决方案:

local ranks = {}
for player,kills in pairs(tableOfKills) do
    table.insert(ranks, {player, kills})
end

-- 现在我们使用Lua内置的sort函数,并使用一个简短的自定义比较器函数:
table.sort(ranks, function (a, b) return a[2] > b[2] end)

-- 唯一剩下的事情就是展示结果:
for i=1,#ranks do
    print(ranks[i][1], ranks[i][2])
end
2021-12-10 20:08:22