当前位置: 首页 > 面试题库 >

golang:以排序的键顺序遍历任意映射

邢博文
2023-03-14
问题内容

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

我发现了一些相关的问题,最接近的问题表明,如果不依靠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方法的接口时遇到了麻烦。特别是,of的返回类型SortedKeys取决于地图的类型,我不知道如何在Go中表达它。


问题答案:

我认为无论谁告诉您您需要的reflect都是正确的;不过,这可能太过分了。我认为重复在这里是可以接受的。

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



 类似资料:
  • 问题内容: 我有一个LinkedHashMap: 我需要从给定键的位置向后迭代。因此,如果为我提供了第十个项目的密钥,则需要向后迭代哈希表9、8、7等。 问题答案: 您不必遍历它。但是拔下钥匙并将其存储在列表中会很方便。这就是执行indexOf()类型操作的唯一方法。

  • 问题内容: 有一个现有的函数以下面的结尾,其中是一个字典: 返回给定字典的未排序迭代器。我想返回一个遍历按 key 排序的项目的迭代器。我怎么做? 问题答案: 尚未对此进行广泛的测试,但是可以在Python 2.5.2中使用。 如果您习惯于使用迭代器代替迭代器,那么上面的解决方案仍然可以使用 在Python 3.x中,使用代替返回迭代器。

  • 问题内容: 请看下面我的地图 我正在按钥匙的大小顺序遍历此地图 但是,这打印出来 有没有一种方法可以按键的大小顺序打印出来,所以,我想像这样遍历这张地图 等等… 非常感谢您的帮助! 问题答案: 收集所有键,对它们进行排序,然后按键迭代地图,如下所示:

  • 我想在级别顺序遍历中打印出BST。但是我以这种奇怪的方式得到了输出。此外,我使用Java可视化工具来检查我的算法,没有线索,因为可视化工具没有说明多个实例。我在想,要么我的变量没有正确地添加到我的实例中,要么没有添加到

  • 问题内容: 我正在为购物车网站构建搜索功能,该功能可以查询SQLServer数据库。当用户在搜索框中输入“呼啦圈”时,我希望包含“呼啦”和“呼啦”的所有记录的结果以任何顺序排列。此外,我需要搜索多个列(即ProductName,Description,ShortName,MaufacturerName等) 搜索“呼啦圈”时,应返回所有这些产品名称: 呼啦圈 呼啦圈 xxhula棍棒的箍 (如果可以

  • 为了遍历通用树,我为下面链接中提到的代码编写了以下显示函数。问题是每个级别打印两次。有人能告诉我为什么吗。如果有人需要整个实现,可以在下面的链接中找到没有此函数的原始代码。其他人只需查看下面的displayBFS函数,并告诉我为什么值会重复 java中泛型树(n元树)的级顺序遍历 谢谢 目前的树状结构可供参考: 输出:100 90 50 70 90 50 70 20 30 200 300 20 3