【问题标题】:golang: traverse arbitrary map in sorted key ordergolang:按排序键顺序遍历任意映射
【发布时间】:2013-04-14 23:41:44
【问题描述】:

简而言之:无论地图的类型如何,如何按排序键顺序遍历地图?

我发现了一些相关的问题,the closest one 暗示不依赖reflect 模块是无法完成的。这种理解正确吗?

考虑这个 Go 代码,它按照键的排序顺序遍历两个不同类型的映射:

mapOne := map[int]string {
    1: "a",
    2: "b",
    3: "c",
}
keysOne := make([]int, 0, len(mapOne))
for key, _ := range mapOne {
    keysOne = append(keysOne, key)
}
sort.Ints(keysOne)
for _, key := range keysOne {
    value := mapOne[key]
    fmt.Println(key, value)
}

mapTwo := map[string]int {
    "a": 1,
    "b": 2,
    "c": 3,
}
keysTwo := make([]string, 0, len(mapTwo))
for key, _ := range mapTwo {
    keysTwo = append(keysTwo, key)
}
sort.Strings(keysTwo)
for _, key := range keysTwo {
    value := mapTwo[key]
    fmt.Println(key, value)
}

提取键然后对它们进行排序的逻辑是重复的 不同的地图类型。 有什么办法可以排除这种逻辑并避免 重复?

我在尝试编写一个提供SortedKeys 方法的接口时遇到了困难。在 特别是,SortedKeys 的返回类型取决于地图的类型, 我不知道如何用 Go 来表达。

【问题讨论】:

    标签: map go


    【解决方案1】:

    我认为告诉你需要reflect 的人是正确的;不过,这可能有点矫枉过正。我认为这里的重复是可以接受的。

    (或者,您可以实现自己的映射,该映射使用某种键接口,但您最终仍需要为每个底层键类型创建满足接口的类型)

    【讨论】:

    • 是的,这是一种重复,一开始在 Go 中编程时会让你发疯,但过了一会儿你会想办法制作数据结构,这样你就不会经常这样做,而且当你这样做时,它只会让每一段代码变得更加简单,因此最终会达到平衡。
    • 恕我直言,“按排序键顺序遍历映射”的整个想法是有缺陷的:Go 中的映射只是没有这个属性。实际上哈希映射通常没有这个属性。如果您的算法需要这种类型的遍历,您应该使用不同的数据结构:上面提到的“您自己的地图”(可能比地图更好地描述为平衡树)。
    猜你喜欢
    • 2018-03-29
    • 1970-01-01
    • 2022-07-20
    • 1970-01-01
    • 2020-07-08
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 2011-02-28
    相关资源
    最近更新 更多