在Lua中对表[]进行排序

sgt*_*ziz 30 sorting lua lua-table

我有一个Lua表,我正在尝试排序.表的格式如下:

tableOfKills[PlayerName] = NumberOfKills
Run Code Online (Sandbox Code Playgroud)

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

tableOfKills[Robin] = 8
tableOfKills[Jon]   = 10
Run Code Online (Sandbox Code Playgroud)

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

Mic*_*man 84

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
Run Code Online (Sandbox Code Playgroud)

以下是使用此类功能的示例:

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
Run Code Online (Sandbox Code Playgroud)

  • 乐意效劳.如果它适合你,请将其标记为答案. (16认同)
  • +1表示`spairs()`迭代器的实现.迭代器通常是一个难以向新用户解释的概念,并且在野外中充分解释的示例将有助于缓解这种情况. (3认同)