在Java中,我使用LinkedHashMap
来实现此目的。 Java LinkedHashMap
的文档非常明确,它具有“可预测的迭代顺序”,我在Scala中也需要相同的内容。
Scala有ListMap
和LinkedHashMap
,但有关他们所做事情的文档很差。
问题:Scala的LinkedHashMap
或ListMap
实现是否用于此目的?如果没有,除了直接使用Java LinkedHashMap
之外还有哪些其他选项?
答案 0 :(得分:46)
来自LinkedHashMap
Scaladoc页面:
答案 1 :(得分:15)
两者之间的区别在于LinkedHashMap
是可变的,而ListMap
是不可变的。否则它们都是MapLike
并且还保留了插入顺序。
答案 2 :(得分:6)
对于LinkedHashMap,答案非常明确,它保留了插入的顺序。
但对于ListMap来说,似乎存在一些混淆。
首先,有两个ListMap。
其次,就我的尝试而言,ListMap的文档出了点问题。
实际订单不是插图顺序。
它也不是插入的逆序。我尝试的结果是[第四,第二,第一,第三]
由列表支持的简单可变映射,因此它保留了插入顺序。
正如文件所述,订单是广告订单。
需要注意的一点是,它以反向插入顺序存储在内部。内部存储的顺序和可迭代/遍历顺序是两件事。内部存储的顺序决定了查找方法的时间复杂度,例如head / last / tail / init /。
此类使用基于列表的数据结构实现不可变映射。列表映射迭代器和遍历方法按照首次插入乳清的顺序访问键值对。
条目以反向插入顺序存储在内部,这意味着最新的键位于列表的开头。
答案 3 :(得分:3)
LinkedHashmap仅作为可变地图实现 ListMaps在可变和不可变的包中实现,但只有不可变的ListMaps保持向后排序。 (可变列表图不保持顺序)
答案 4 :(得分:2)
答案 5 :(得分:0)
Scala 2.13引入了Map
的两个新的不变实现,它们保持插入顺序:VectorMap
和SeqMap
。看到这个PR:”
当前没有任何已知的不可变映射在保持键插入顺序的同时还保持键上的有效查找时间不变,因此唯一已知的实现是通过将Vector与HasMap结合使用(或者在Scala的情况下是HashMap / ChampHashMap)
截至撰写本文时,Scala 2.13仍计划在2018年发布。