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

为什么不能按插入顺序迭代地图?

柯新翰
2023-03-14
问题内容

我有一个导航栏作为地图:

var navbar = map[string]navbarTab{
}

其中navbarTab具有各种属性,子项等。当我尝试渲染导航栏(带有for tabKey := range navbar)时,它以随机顺序显示。我知道range它在运行时会随机排序,但是似乎无法获取有序的键列表或按插入顺序进行迭代。

游乐场链接位于此处:http :
//play.golang.org/p/nSL1zhadg5,尽管它似乎没有表现出相同的行为。

如何在不破坏插入顺序的情况下迭代此映射?


问题答案:

Go地图不保持插入顺序;您将必须自己实现此行为。

例:

type NavigationMap struct {
    m map[string]navbarTab
    keys []string
}

func NewNavigationMap() *NavigationMap { ... }

func (n *NavigationMap) Set(k string, v navbarTab) {
    n.m[k] = v
    n.keys = append(n.keys, k)
}

本示例不完整,并且未涵盖所有用例(例如,更新重复键上的插入顺序)。

如果您的用例包括多次重新插入相同的键(如果键 k 已在映射中,则不会更新键 k的 插入顺序):

func (n *NavigationMap) Set(k string, v navbarTab) {
    _, present := n.m[k]
    n.m[k] = v
    if !present {
        n.keys = append(n.keys, k)
    }
}

选择满足您要求的最简单的方法



 类似资料:
  • 问题内容: 上面的go代码仅打印一次map [string] string三次。 我希望它具有固定的输出,但它显示如下: 变了! 而在python中: 输出: 问题答案: 您不能依靠获得密钥的顺序。语言规范说: “一个映射是一组无序的元素”,后来又说: “未指定映射的迭代顺序,并且不能保证每次迭代之间都相同。”

  • 问题内容: 在围棋编程语言规范说: 3.未指定地图的迭代顺序。[…] 这是可以预期的,因为地图类型可以实现为哈希表,搜索树或其他某种数据结构。但是,如何在Go中实现呢? 换句话说,是什么决定了键的迭代顺序 我开始怀疑这个之后,我看到了地图键显然 也 有一定的迭代顺序。像这样的程序 在我的机器上打印以下内容: 无论 插入顺序如何。 带有映射的等效程序也以随机顺序打印键,但是这里的键顺序 取决于 插入

  • 问题内容: 我担心给出的文件和目录的顺序。如果我有这些目录,,,,,,,,,,,,,什么是输出列表的顺序? 它是按数值排序的吗? 或按ASCII值排序,如? 此外,如何获得特定的排序? 问题答案: 用途。这是的文档字符串: listdir(路径)-> list_of_strings 返回一个列表,其中包含目录中条目的名称。 该列表按任意顺序排列 。它不包括特殊条目“。” 和“ ..”,即使它们存在

  • 问题内容: 如何以以下方式将值插入表(MySQL): 在表的所有行上,按ID列(PK)的顺序,在“ num”列中插入递增数字? 例如,如果表有3行,其ID为1,5,2,我希望ID 1获得num = 1,ID 2获得num = 2,ID 5获得num = 3。 编辑 我将解释为什么(我认为)需要这样做: 我试图将表中的列拆分为具有1对1关系的单独表。我以为我可以按ID的顺序获取所有值,然后将它们插入

  • 我有2个子项目的java项目。像这样的结构 我只需要在root buiild.gradle中创建'deploy'任务,然后执行以下操作: null 我看到错误“no-source”,但是文件夹“client/build/libs”和“server/build/libs”存在并包含jar。我可以肯定,因为手动运行任务‘复制文件’创建文件夹‘目标’和复制所有文件。我看到的唯一可能的选项是“复制文件”任

  • 问题内容: 在Java 5及更高版本中,您具有foreach循环,该循环可以神奇地实现任何实现的对象: 但是,仍然没有实现,这意味着要迭代一个,您必须执行以下操作: 有谁知道为什么仍然不执行? 编辑: 为澄清起见,我不是在谈论枚举的语言概念,而是在Java API中称为“ 枚举 ” 的Java特定类。 问题答案: 枚举没有被修改为支持Iterable,因为它是一个接口,而不是一个具体的类(例如Ve