2013-08-20 4 views
13

Пожалуйста, смотрите ниже моей картеКак перебирать карту в golang по порядку?

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

Я ищу петлю через эту карту в порядке размера ключа

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

Однако это распечатывает

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 

Есть ли способ, чтобы я мог распечатать их в порядке размера ключа, поэтому я хотел бы пропустить эту карту так, как это

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 даже преднамеренно рандомизировали последовательность итераций (т. Е. Используют генератор случайных чисел, так что каждый оператор диапазона дает отчетливый ордер), поэтому никто не ошибочно зависит от любого порядка взаимодействия. (Что произойдет, если вы будете зависеть от того, что каждый раз будет отличаться? 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]) 
} 
Смежные вопросы