在Scala中将成对列表转换为Map时为什么不保留元素顺序?

时间:2018-06-20 06:37:49

标签: scala

示例:

val occ = List(('l', 2), ('n', 1), ('r', 1), ('u', 2), ('x', 1))
occ.toMap
// Map(x -> 1, n -> 1, u -> 2, l -> 2, r -> 1)

元素不再按字母顺序排序。为什么会这样?

3 个答案:

答案 0 :(得分:1)

编辑:2.13中有一个LinkedMap,但权衡取舍。

编辑:问题的确是您可能期望list.toMap产生ListMap。为什么不呢?

doc说:“插入或删除条目也是O(n),这使得该集合仅适用于少量元素。”

这是对尺寸的另一种敏感性。通常,您将其他操作成对创建一个集合,而只想将它们转储到一个地图中,通常是一个很大的地图。

-

由于专业化,对尺寸敏感。有最小尺寸的自定义地图。这不能保证,但是如果您注意到该模式,则会造成混淆。

scala $ ~/scala-2.12.6/bin/scala -Dscala.repl.info
Welcome to Scala 2.12.6 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_144).
Type in expressions for evaluation. Or try :help.
[info] started at Wed Jun 20 00:17:33 PDT 2018

scala 2.12.6> val m = List(1->10,2->20,3->30,4->40).toMap
m: scala.collection.immutable.Map[Int,Int] = Map(1 -> 10, 2 -> 20, 3 -> 30, 4 -> 40)

scala 2.12.6> val m = List(1->10,2->20,3->30,4->40,5->50).toMap
m: scala.collection.immutable.Map[Int,Int] = Map(5 -> 50, 1 -> 10, 2 -> 20, 3 -> 30, 4 -> 40)

scala 2.12.6> :quit
scala $ ~/scala-2.13.0-M4/bin/scala -Dscala.repl.info
[info] started at Wed Jun 20 00:18:41 PDT 2018
Welcome to Scala 2.13.0-M4 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_144).
Type in expressions for evaluation. Or try :help.

scala 2.13.0-M4> val m = List(1->10,2->20,3->30,4->40).toMap
m: scala.collection.immutable.Map[Int,Int] = ChampHashMap(1 -> 10, 2 -> 20, 3 -> 30, 4 -> 40)

scala 2.13.0-M4> val m = List(1->10,2->20,3->30,4->40,5->50).toMap
m: scala.collection.immutable.Map[Int,Int] = ChampHashMap(5 -> 50, 1 -> 10, 2 -> 20, 3 -> 30, 4 -> 40)

答案 1 :(得分:1)

Map未排序,并且密钥可能以任何顺序排列,具体取决于实现方式。

但是ListMap保留加法顺序。您可以使用常规的ListMap操作来构建Map,也可以像这样从List创建一个操作:

ListMap(occ:_*)

答案 2 :(得分:0)

您可以使用ListMap代替Map,它可以使项目保持插入顺序。要将List转换为ListMap

val occ = List(('l', 2), ('n', 1), ('r', 1), ('u', 2), ('x', 1))
ListMap(occ: _*)

如果您不知道_*的含义-repeated parameters