如何将List(String,String)转换为ListMap[String,String]?

13

我有一个类型为 List(String,String) 的列表,我想将其转换为Map。当我使用 toMap 方法时,我发现它不保留List中数据的顺序。然而,我的目标是通过保持List中数据的顺序来将列表转换为Map。我了解到 ListMap 保留插入顺序(但是它是不可变的),所以我可以使用 LinkedHashMap 结合map函数来将数据顺序地插入 LinkedHashMap 中,但这意味着我需要迭代所有元素,这很麻烦。请问是否有更好的方法?谢谢。


我的目标是将列表转换为Map,同时保持数据的顺序与列表相同。但是Map并不像这样工作。 - n. m.
我了解到 ListMap 保留插入顺序。你是怎么学习到的呢?文档里好像没有这个信息。 - n. m.
我从这篇帖子中了解到:https://dev59.com/FW865IYBdhLWcg3wZNvT - Explorer
显然,那里的答案告诉你要使用LinkedHashMap,为什么不试试呢? - n. m.
@n.m. 我正在尝试两种集合,并学习它们的性能。 - Explorer
3个回答

19

应该可以这样做:

val listMap = ListMap(list : _*)

感谢@C4stor的评论,它起作用了。我是Scala的新手,关于注释的简短解释将有助于更深入地理解。 - Explorer
1
ListMap#apply 接受元组可变参数。通过调用 : _*,列表的元素将以可变参数的方式应用,据我所知。也许这个gist会有帮助。另请参见 https://dev59.com/9XNA5IYBdhLWcg3wVcFx 获取更多信息。 - Kevin Meredith
1
@KevinMeredith说得对。我认为一个更相关的问题是理解:_*在Scala中的作用是什么?这个链接 https://dev59.com/PW025IYBdhLWcg3wW0yx 中有所有你需要的信息 :) - C4stor
"冒号下划线星号" 很不错,但是我最喜欢的是 @Jasper-M 提到的 mylist.to(ListMap)(Scala >=2.13)。 - Hartmut Pfarr
当然可以,但是Scala 2.13发布时间比这个问题提出的时间晚了两年以上,所以有这个 ^^ - C4stor

4
在Scala 2.13或更高版本中:
scala> import scala.collection.immutable.ListMap
import scala.collection.immutable.ListMap

scala> val list = List((1,2), (3,4), (5,6), (7,8), (9,0))
list: List[(Int, Int)] = List((1,2), (3,4), (5,6), (7,8), (9,0))

scala> list.to(ListMap)
res3: scala.collection.immutable.ListMap[Int,Int] = ListMap(1 -> 2, 3 -> 4, 5 -> 6, 7 -> 8, 9 -> 0)

0
不要使用ListMap,它们的性能非常低下。由于它们是以列表形式结构化的,所以具有线性查找性能(https://docs.scala-lang.org/overviews/collections/performance-characteristics.html)。
我建议实例化一个可变的LinkedHashmap,然后将其分配给定义为collections.Map的val。collection.Map接口不公开可变方法,因此对其进行访问的任何实体都是不可变的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接