web-dev-qa-db-fra.com

Trier une table [] à Lua

J'ai une table Lua que j'essaie de trier. Le format du tableau est le suivant:

tableOfKills[PlayerName] = NumberOfKills

Ce qui signifie, par exemple, si j'avais un joueur nommé Robin avec un total de 8 éliminations et un autre nommé Jon avec un total de 10 éliminations, le tableau serait:

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

Comment pourrais-je trier ce type de tableau pour afficher en premier les tués les plus élevés? Merci d'avance!

29
sgtaziz

Une table dans Lua est un ensemble de mappages de valeurs-clés avec des clés uniques. Les paires sont stockées dans un ordre arbitraire et par conséquent, la table n'est triée en aucune façon.

Ce que vous pouvez faire est itérer sur la table dans un certain ordre. La base pairs ne vous donne aucune garantie de l'ordre dans lequel les clés sont visitées. Voici une version personnalisée de pairs, que j'ai appelée spairs car elle itère sur la table dans un ordre trié:

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

Voici un exemple d'utilisation d'une telle fonction:

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
83
Michal Kottman