在Java中,我使用 LinkedHashMap 以此目的。Java 的文档 LinkedHashMap 很明显它有“可预测的迭代顺序”,我在 Scala 中也需要同样的东西。

斯卡拉有 ListMapLinkedHashMap, ,但是关于他们到底做了什么的文档很差。

问题:是斯卡拉的 LinkedHashMap 或者 ListMap 用于此目的的实现?如果没有,除了使用 Java 之外还有什么其他选项可用? LinkedHashMap 直接地?

有帮助吗?

解决方案

来自 LinkedHashMap 斯卡拉文档页面:

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

其他提示

两者的区别在于 LinkedHashMap 是可变的,而 ListMap 是不可变的。否则他们俩都是 MapLike 并保留插入顺序。

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

但对于ListMap来说,这里似乎存在一些困惑。

首先,有两个ListMap。

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

其次,据我所知,ListMap 的文档有问题。

可变的ListMap

实际的顺序并不是所说的插入顺序。

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

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

不可变的ListMap

正如文档所说,顺序是插入顺序。

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

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

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

  • LinkedHashmap 按照添加的顺序排列
  • (不可变)ListMap 的顺序与添加时的顺序相反(即最后添加的是第一个)

LinkedHashMap仅在可变的和不可变化的软件包中实现了可变的地图列表图,但是只有不变的ListMaps维护向后订购。(可变列表映射不维护顺序)

ListMap 不保留插入顺序。

enter image description here

仅有的 LinkedHashMap 保持元素插入方式的顺序。

enter image description here

如果您想维护地图以外的列表中的顺序,您可以使用 LinkedList

enter image description here

Scala 2.13 引入了两个新的不可变实现 Map 保持插入顺序: VectorMapSeqMap. 。看到这个 公关:"

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top