Scala Map 实现按插入顺序保留条目?
-
26-09-2019 - |
题
在Java中,我使用 LinkedHashMap
以此目的。Java 的文档 LinkedHashMap
很明显它有“可预测的迭代顺序”,我在 Scala 中也需要同样的东西。
斯卡拉有 ListMap
和 LinkedHashMap
, ,但是关于他们到底做了什么的文档很差。
问题:是斯卡拉的 LinkedHashMap
或者 ListMap
用于此目的的实现?如果没有,除了使用 Java 之外还有什么其他选项可用? LinkedHashMap
直接地?
解决方案
来自 LinkedHashMap
斯卡拉文档页面:
- “此类使用哈希表实现可变映射。该课程的迭代器和所有遍历方法都按照插入的顺序访问元素。”
其他提示
两者的区别在于 LinkedHashMap
是可变的,而 ListMap
是不可变的。否则他们俩都是 MapLike
并保留插入顺序。
对于LinkedHashMap,答案非常明确,它保留了插入的顺序。
但对于ListMap来说,这里似乎存在一些困惑。
首先,有两个ListMap。
- scala.collection.mutable.ListMap
- scala.collection.immutable.ListMap。
其次,据我所知,ListMap 的文档有问题。
实际的顺序并不是所说的插入顺序。
而且它也不是插入的逆顺序。我尝试的结果是[第四,第二,第一,第三]
由列表支持的简单可变映射,因此它保留插入顺序。
正如文档所说,顺序是插入顺序。
需要注意的一件事是它在内部以相反的插入顺序存储。内部存储的顺序和可迭代/遍历的顺序是两件事。内部存储的顺序决定了head/last/tail/init/等查找方法的时间复杂度。
此类使用基于列表的数据结构实现不可变映射。列表映射迭代器和遍历方法按照首次插入的顺序访问键值对。
条目以相反的插入顺序在内部存储,这意味着最新的键位于列表的头部。
- LinkedHashmap 按照添加的顺序排列
- (不可变)ListMap 的顺序与添加时的顺序相反(即最后添加的是第一个)
LinkedHashMap仅在可变的和不可变化的软件包中实现了可变的地图列表图,但是只有不变的ListMaps维护向后订购。(可变列表映射不维护顺序)
Scala 2.13 引入了两个新的不可变实现 Map
保持插入顺序: VectorMap
和 SeqMap
. 。看到这个 公关:"
目前,还没有任何已知的不可变映射可以在保持键插入顺序的同时有效地保持键上的查找时间恒定,因此唯一已知的实现是通过将 Vector 与 HasMap 相结合(或者在 Scala 的情况下为 HashMap/ChampHashMap)来完成
截至撰写本文时,Scala 2.13 仍计划于 2018 年发布。