示例:
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)
元素不再按字母顺序排序。为什么会这样?
答案 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