2013-03-29 22 views
21

Sıralamaya çalıştığım bir Lua tablosu var.Tablo [] in Lua içinde sırala

Ben 10 öldürür toplam 8 öldürür toplam ve başka adlandırılmış Jon ile Robin adında bir oyuncu olsaydı, örneğin, gelir
tableOfKills[PlayerName] = NumberOfKills 

, masa olacaktır: şu şekildedir: Tablonun biçimidir

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

Bu tür tabloyu, en yüksek ölümleri ilk önce göstermek için nasıl sıralayabilirim? Şimdiden teşekkürler!

+1

olası yinelenen [ tablodan veriyi sipariş ile kopyalamak için] (http://stackoverflow.com/questions/5153642/copying-data-from-table-to-antoher-with-order) – finnw

+0

Tablo dizi veya benzeri bir şey değil. Belirtilen bir emri yok. – texasbruce

cevap

65

Lua'daki bir tablo, benzersiz anahtarlarla bir dizi anahtar/değer eşleştirmesidir. Çiftler rastgele sırayla saklanır ve bu nedenle tablo hiçbir şekilde sıralanmaz.

Yapabilecekleriniz, bazı sırada tablonun üzerine yinelemek. Temel pairs, anahtarların ziyaret edildiği sırayla ilgili herhangi bir garanti vermez. İşte

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 

böyle fonksiyonun kullanımına ilişkin bir örnektir: Burada sıralı bir şekilde masaya üzerinde dolaşır çünkü spairs denilen pairs özelleştirilmiş bir versiyonudur ve

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

Mükemmel. Teşekkür ederim! – sgtaziz

+12

Yardım etmekten memnun oldum. Lütfen size uygun bir cevap olarak işaretleyin. Spairs() 'yineleyicisinin bir uygulaması için –

+2

+1. Yineleyiciler, yeni kullanıcılara açıklamak için genellikle zor bir kavramdır ve vahşi durumdaki iyi açıklanmış örnekler bunu azaltmaya yardımcı olur. – RBerteig