2013-03-29 3 views
21

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

tableOfKills[PlayerName] = NumberOfKills 

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

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

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

+1

возможный дубликат [ копирование данных из таблицы в antoher с порядком] (http://stackoverflow.com/questions/5153642/copying-data-from-table-to-antoher-with-order) – finnw

+0

Таблица - это не упорядоченный массив или что-то в этом роде. У него нет проявленного порядка. – texasbruce

ответ

65

Таблица в 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

Perfect. Спасибо! – sgtaziz

+12

Рад помочь. Пожалуйста, отметьте это как ответ, если он вам подходит. –

+2

+1 для реализации 'spairs()' iterator. Итераторы часто представляют собой сложную концепцию для объяснения новых пользователей, и хорошо объясненные примеры в дикой природе помогут смягчить это. – RBerteig

Смежные вопросы