Подтвердить что ты не робот

Сортировка таблицы [] в Lua

У меня есть таблица Lua, которую я пытаюсь сортировать. Формат таблицы выглядит следующим образом:

tableOfKills[PlayerName] = NumberOfKills

Это означает, что, например, если у меня был игрок по имени Робин, в общей сложности 8 убийств и другой по имени Джон с общим количеством 10 убийств, таблица была бы следующей:

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

Как мне отсортировать этот тип таблицы, чтобы сначала показать самые высокие убийства? Спасибо заранее!

4b9b3361

Ответ 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