2013-08-20 28 views
13

Golang'da bir haritadan nasıl sıralanır?

var romanNumeralDict map[int]string = map[int]string{ 
    1000: "M", 
    900 : "CM", 
    500 : "D", 
    400 : "CD", 
    100 : "C", 
    90 : "XC", 
    50 : "L", 
    40 : "XL", 
    10 : "X", 
    9 : "IX", 
    5 : "V", 
    4 : "IV", 
    1 : "I", 
} 

Ben Ancak anahtar

for k, v := range romanNumeralDict { 
    fmt.Println("k:", k, "v:", v) 
    } 

büyüklüğüne sırasına göre bu harita üzerinden döngü için arıyorum benim haritanın altındaki bakınız, bu

k: 1000 v: M 
k: 40 v: XL 
k: 5 v: V 
k: 4 v: IV 
k: 900 v: CM 
k: 500 v: D 
k: 400 v: CD 
k: 100 v: C 
k: 90 v: XC 
k: 50 v: L 
k: 10 v: X 
k: 9 v: IX 
k: 1 v: I 

yazdırır Onları anahtarın sırasına göre yazdırabilmem için bir yol var mı? Bu şekilde bu haritadan geçmek istiyorum

k:1 
K:4 
K:5 
K:9 
k:10 

vs ...

Yardımlarınız için çok teşekkür ederiz!

+0

Sen, döngü gerekir Dilime çiftleri eklemek ve dilim sıralamak. – Crisfole

+0

Bkz. Http://stackoverflow.com/questions/12108215/golang-map-prints-out-of-order –

+4

[Özellik] 'e göre (http://golang.org/ref/spec#For_statements), " Haritalar üzerinden yineleme sırası belirtilmez ve bir yinelemeden diğerine aynı olması garanti edilmez. " Go yazarları iterasyon dizisini bilerek randomize ettiler (yani, her bir aralık ifadesinin ayrı bir ordr ürettiği şekilde bir rasgele sayı üreteci kullandılar) böylece kimse herhangi bir interaksiyon sırasına yanlış bir şekilde bağlı değildir. (Her seferinde farklı olan siparişe bağlı olursanız ne olur? Hm ...) – fuz

cevap

27

tüm anahtarları toplayın, onları sıralamak ve aşağıdaki gibi anahtar ile haritanızı yineleme:

keys := make([]int, 0) 
for k, _ := range romanNumeralDict { 
    keys = append(keys, k) 
} 
sort.Ints(keys) 
for _, k := range keys { 
    fmt.Println(k, romanNumeralDict[k]) 
}