在 Lua 中对表 [] 进行排序

Posted

技术标签:

【中文标题】在 Lua 中对表 [] 进行排序【英文标题】:Sort a Table[] in Lua 【发布时间】:2013-03-20 07:59:45 【问题描述】:

我有一个要排序的 Lua 表。表格格式如下:

tableOfKills[PlayerName] = NumberOfKills

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

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

如何对这种类型的表格进行排序以首先显示最高击杀数?提前致谢!

【问题讨论】:

copying data from table to antoher with order的可能重复 表不是有序数组什么的。它没有明确的顺序。 【参考方案1】:

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

【讨论】:

+1 用于实现 spairs() 迭代器。迭代器通常是一个难以向新用户解释的概念,而在野外得到充分解释的示例将有助于缓解这种情况。【参考方案2】:

另一种避免迭代器等的排序方法是将表传递给键值对列表(即: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

【讨论】:

正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于在 Lua 中对表 [] 进行排序的主要内容,如果未能解决你的问题,请参考以下文章

在 asp.net MVC 中对表进行排序

如何按 Lua 中的值对表进行排序?

如何在sqlite中对表中的行进行排名?

Lua中的数组排序

VBA对表进行排序并忽略总行

尝试在表达式上对表进行排序