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

时间:2010-10-01 00:30:38

标签: scala scala-collections scala-2.8 ordered-map

在Java中,我使用LinkedHashMap来实现此目的。 Java LinkedHashMap的文档非常明确,它具有“可预测的迭代顺序”,我在Scala中也需要相同的内容。

Scala有ListMapLinkedHashMap,但有关他们所做事情的文档很差。

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

6 个答案:

答案 0 :(得分:46)

来自LinkedHashMap Scaladoc页面:

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

答案 1 :(得分:15)

两者之间的区别在于LinkedHashMap是可变的,而ListMap是不可变的。否则它们都是MapLike并且还保留了插入顺序。

答案 2 :(得分:6)

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

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

首先,有两个ListMap。

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

其次,就我的尝试而言,ListMap的文档出了点问题。

mutable.ListMap

实际订单不是插图顺序。

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

  

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

immutable.ListMap

正如文件所述,订单是广告订单。

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

  

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

     

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

答案 3 :(得分:3)

  • LinkedHashmap按照添加顺序
  • (不可变)ListMap按其添加的向后顺序(即最后添加的是第一个)

LinkedHashmap仅作为可变地图实现 ListMaps在可变和不可变的包中实现,但只有不可变的ListMaps保持向后排序。 (可变列表图不保持顺序)

答案 4 :(得分:2)

ListMap并未保留插入顺序。

enter image description here

只有LinkedHashMap按照插入方式维护元素的顺序。

enter image description here

如果您希望维护列表中的顺序,则可以使用LinkedList

enter image description here

答案 5 :(得分:0)

Scala 2.13引入了Map的两个新的不变实现,它们保持插入顺序:VectorMapSeqMap。看到这个PR:”

  

当前没有任何已知的不可变映射在保持键插入顺序的同时还保持键上的有效查找时间不变,因此唯一已知的实现是通过将Vector与HasMap结合使用(或者在Scala的情况下是HashMap / ChampHashMap)

截至撰写本文时,Scala 2.13仍计划在2018年发布。