2013-08-20 8 views
13

proszę zobaczyć poniżej mojej mapieJak iterować mapę w języku golang w celu?

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", 
} 

szukam do pętli tej mapy w kolejności wielkości klucza

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

Jednak ten wypisuje

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 

Czy istnieje sposób, że mogę je wydrukować w kolejności wielkości klucza, więc chciałbym przeglądać tę mapę w ten sposób:

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

etc ...

Dziękuję bardzo za pomoc!

+0

Musisz pętli, dodać pary do plasterka i sortowania plaster. – Crisfole

+0

Zobacz http://stackoverflow.com/questions/12108215/golang-map-prints-out-of-order –

+4

Zgodnie z [spec] (http://golang.org/ref/spec#For_statements), "The kolejność iteracji na mapach nie jest określona i nie ma gwarancji, że będzie taka sama od jednej iteracji do następnej. " Autorzy Go nawet celowo losowali sekwencję iteracji (to znaczy używają generatora liczb losowych, tak aby każde stwierdzenie zakresu dawało wyraźny porządek), więc nikt niesłusznie nie zależy od jakiejkolwiek kolejności interakcji. (Co się stanie, jeśli będziesz zależał od tego, że kolejność będzie inna za każdym razem? Hm ...) – fuz

Odpowiedz

27

Zbierz wszystkie klucze, sortować je i iteracyjne swoją mapę przez klucz, jak następuje:

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