2013-08-20 23 views
13

しかし、これはgolangの地図を順番に反復する方法は?

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 

を出力し、私はキー

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

の大きさのために、このマップをループするために探しています私のマップ

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

は、以下を参照してくださいキーの大きさの順に印刷する方法はありますか?このマップをこのようにループしたいのですが

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

等...

はあなたの助けをありがとうございました!

+0

あなたは、をループする必要がありますスライスにペアを追加し、スライスを並べ替えます。 – Crisfole

+0

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

+4

[spec](http://golang.org/ref/spec#For_statements)によると、「Theマップ上の反復順序は指定されず、ある反復から次の反復まで同じであることが保証されていません。 Goの著者は意図的に反復シーケンスをランダム化していた(すなわち、各レンジステートメントが異なるordrをもたらすように乱数ジェネレータを使用する)ので、誰もどのinteration orderにも間違って依存していませんでした。 (毎回違う注文に依存しているとどうなりますか?hm ...) – fuz

答えて

27

は、すべてのキーを収集し、それらを並べ替えると、以下のように、キーでマップを反復:

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