如何按顺序遍历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

ETC…

原文由 samol 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 534
2 个回答

收集所有键,对它们进行排序并按键迭代你的地图,如下所示:

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

原文由 Volker 发布,翻译遵循 CC BY-SA 3.0 许可协议

您可以通过预分配 keys 使其更快一些,因为您知道它的长度:

 func sortedKeys(m map[Key]Value) ([]Key) {
        keys := make([]Key, len(m))
        i := 0
        for k := range m {
            keys[i] = k
            i++
        }
        sort.Keys(keys)
        return keys
}

KeyValue 替换为您的键和值类型(包括 sort 行)。 咳嗽仿制药咳嗽

编辑:Go 1.18 终于有了泛型!这是通用版本:

 // Ordered is a type constraint that matches any ordered type.
// An ordered type is one that supports the <, <=, >, and >= operators.
//
// Note the generics proposal suggests this type will be available from
// a standard "constraints" package in future.
type Ordered interface {
    type int, int8, int16, int32, int64,
        uint, uint8, uint16, uint32, uint64, uintptr,
        float32, float64,
        string
}

func sortedKeys[K Ordered, V any](m map[K]V) ([]K) {
        keys := make([]K, len(m))
        i := 0
        for k := range m {
            keys[i] = k
            i++
        }
        sort.Slice(keys, func(i, j int) bool { return keys[i] < keys[j] })
        return keys
}

游乐场示例

原文由 Timmmm 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题