Scala Map实现按插入顺序保留条目?

ebr*_*hez 39 scala scala-2.8 scala-collections ordered-map

在Java中,我LinkedHashMap用于此目的.Java的文档LinkedHashMap很清楚,它具有"可预测的迭代顺序",我在Scala中需要相同的东西.

Scala有ListMapLinkedHashMap,但他们这样做究竟是什么文件很糟糕.

问题:Scala LinkedHashMapListMap实现是否用于此目的?如果没有,除了LinkedHashMap直接使用Java之外还有哪些其他选项?

Ran*_*ulz 46

LinkedHashMapScaladoc页面:

  • "这个类使用哈希表实现可变映射.此类的迭代器和所有遍历方法按插入顺序访问元素."


Rei*_*cer 16

两者之间的差异LinkedHashMap是可变的而不可变的ListMap.否则它们都是MapLike并且还保留了插入顺序.

  • 有不可变的ListMap和可变的ListMap. (2认同)
  • 另一个区别是`ListMap`具有[查找和插入的线性复杂性](https://docs.scala-lang.org/overviews/collections/performance-characteristics.html) (2认同)

Mic*_*lle 6

对于LinkedHashMap,答案非常明确,它保留了插入顺序.

但对于ListMap来说,似乎存在一些混淆.

首先,有两个ListMap.

  • scala.collection.mutable.ListMap
  • scala.collection.immutable.ListMap.

其次,就我尝试而言,ListMap的文档有些不对劲.

mutable.ListMap

实际订单不是它所说的插入顺序.

并且它也不是插入的逆序.我尝试的结果是[第四,第二,第一,第三]

由列表支持的简单可变映射,因此它保留了插入顺序.

immutable.ListMap

正如文件所说,订单是插入订单.

需要注意的一点是,它以反向插入顺序存储在内部.内部存储的顺序和可迭代/遍历顺序是两件事.内部存储的顺序决定了查找方法的时间复杂度,例如head/last/tail/init /.

此类使用基于列表的数据结构实现不可变映射.列表映射迭代器和遍历方法按照首次插入乳清的顺序访问键值对.

条目以反向插入顺序存储在内部,这意味着最新的密钥位于列表的开头.