2013-08-20 4 views
13

Bitte siehe unten meine KarteWie durchläuft man eine Karte in Golang in Reihenfolge?

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

Ich suche jedoch in der Reihenfolge der Größe des Schlüssels

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

durch diese Karte zu Schleife, druckt diese

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 

aus Gibt es eine Möglichkeit, dass ich sie in der Reihenfolge der Größe des Schlüssels ausdrucken kann, so würde ich gerne diese Karte wie diese

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

etc ...

Vielen Dank für Ihre Hilfe!

+0

Sie werden durch eine Schleife benötigen, fügen Sie die Paare auf einer Scheibe, und sortieren Sie die Scheibe. – Crisfole

+0

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

+4

Laut der [spec] (http://golang.org/ref/spec#For_statements), "The Iterationsreihenfolge über Maps ist nicht spezifiziert und es ist nicht garantiert, dass sie von einer Iteration zur nächsten identisch sind. " Die Go-Autoren haben sogar die Iterationssequenz absichtlich randomisiert (d. H. Sie verwenden einen Zufallszahlengenerator, so dass jede Bereichsanweisung ein unterschiedliches ordr ergibt), so dass niemand in irgendeiner Weise von einer Interationsordnung abhängt. (Was passiert, wenn Sie davon abhängen, dass die Reihenfolge jedes Mal anders ist? Hm ...) – fuz

Antwort

27

alle Schlüssel sammeln, sortieren sie und Ihre Karte durch Schlüssel iterieren, wie folgt aus:

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