46

在 Java 中,我LinkedHashMap用于此目的。Java 的文档LinkedHashMap非常清楚,它具有“可预测的迭代顺序”,而我在 Scala 中也需要它。

Scala 有ListMapand LinkedHashMap,但是关于他们所做的事情的文档很差。

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

4

6 回答 6

51

LinkedHashMapScaladoc 页面:

  • “此类使用哈希表实现可变映射。此类的迭代器和所有遍历方法按照插入的顺序访问元素。”
于 2010-10-01T02:45:08.713 回答
18

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

于 2013-10-25T02:22:19.710 回答
6

对于 LinkedHashMap,答案很清楚,它保留了插入的顺序。

但是对于ListMap,这里似乎有些混乱。

首先,有两个ListMap。

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

其次,据我尝试,ListMap 的文档有问题。

可变的.ListMap

实际订单不是它所说的插入订单。

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

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

不可变的.ListMap

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

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

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

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

于 2017-04-22T06:23:54.067 回答
3
  • LinkedHashmap 按添加顺序排列
  • (不可变) ListMap 的添加顺序是倒序的(即添加的最后一个是第一个)

LinkedHashmap 仅作为可变映射实现 ListMaps 在 mutable 和 immutable 包中都实现,但是只有不可变 ListMaps 保持向后排序。(可变列表图不保持顺序)

于 2016-03-17T22:50:31.790 回答
2

ListMap不保留插入顺序。

在此处输入图像描述

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

在此处输入图像描述

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

在此处输入图像描述

于 2016-12-12T03:35:51.193 回答
2

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

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

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

更新 2021-04-14:Scala 3.13VectorMap现在确实有。SeqMap只是“有序不可变映射的通用特征”。除了新VectorMap的和旧的ListMap,还有一个新的TreeSeqMap

请注意,mutable.ListMap2.13 已弃用,但immutable.ListMap仍然是最新的。

于 2018-08-27T17:16:07.883 回答