2013-03-29 13 views
21

Mam tabelę Lua, którą próbuję sortować. Format tabeli jest następująca:Sortuj tabelę [] w Lua

tableOfKills[PlayerName] = NumberOfKills 

co oznacza na przykład, gdybym miał odtwarzacz o nazwie Robin w sumie 8 wrogów i innym imieniem Jona w sumie 10 zwycięstw, tabela będzie:

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

W jaki sposób mogę sortować ten typ stołu, aby najpierw pokazać najwyższe zabójstwa? Z góry dziękuję!

+1

możliwym duplikatu [ kopiowanie danych z tabeli do kolejnej z zamówieniem] (http://stackoverflow.com/questions/5153642/copying-data-from-table-to-antoher-with-order) – finnw

+0

Tabela nie jest uporządkowaną tablicą lub czymś. Nie ma zamanifestowanej kolejności. – texasbruce

Odpowiedz

65

Tabela w języku Lua to zestaw mapowań klucz-wartość z unikalnymi kluczami. Pary są przechowywane w dowolnej kolejności i dlatego tabela nie jest w żaden sposób sortowana.

Co można zrobić, to iterować nad tabelą w dowolnej kolejności. Podstawowy pairs nie daje żadnej gwarancji kolejności, w jakiej klucze są odwiedzane. Tutaj jest dostosowana wersja pairs, który nazwałem spairs ponieważ iteracje nad stołem w posortowanych:

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 

Oto przykład wykorzystania takiej funkcji:

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

Idealny. Dziękuję Ci! – sgtaziz

+12

Cieszę się, że mogę Ci pomóc. Proszę oznaczyć to jako odpowiedź, jeśli ci odpowiada. –

+2

+1 dla implementacji iteratora 'spairs()'. Iteratory często stanowią trudną koncepcję do wyjaśnienia nowym użytkownikom, a dobrze objaśnione przykłady w środowisku naturalnym mogą pomóc w złagodzeniu tego. – RBerteig