我该如何在Scala中生成一个不可变的Map?

10

我已经尝试了这个方法,但它没有起作用:

val map:Map[String,String] = for {
    tuple2 <- someList
  } yield tuple2._1 -> tuple2._2

我该如何将一个 Tuple2 的列表转换成 Map 呢?

4个回答

14

这没什么难的:

Map(listOf2Tuples: _*)

Map伴生对象中使用apply方法。


只有当listOf2Tuples是明确的,而不是一个变量/常量时才有效。 - michael.kebe
直到 toMap 出现(scala 2.8) - krookedking
这个回复是在2.8正式版之前的 :) - Alexey Romanov

10

我的第一次尝试是这样的:

scala> val country2capitalList = List("England" -> "London", "Germany" -> "Berlin")
country2capitalList: List[(java.lang.String, java.lang.String)] = List((England,London), (Germany,Berlin))

scala> val country2capitalMap = country2capital.groupBy(e => e._1).map(e => (e._1, e._2(0)._2))
country2capitalMap: scala.collection.Map[java.lang.String,java.lang.String] = Map(England -> London, Germany -> Berlin)

但这是最好的解决方案:

scala> val betterConversion = Map(country2capitalList:_*)
betterConversion: scala.collection.immutable.Map[java.lang.String,java.lang.String] = Map(England -> London, Germany -> Berlin)

需要使用:_*,以提示编译器将列表用作varargs参数。否则,它会给你:

scala> Map(country2capitalList)
<console>:6: error: type mismatch;
 found   : List[(java.lang.String, java.lang.String)]
 required: (?, ?)
       Map(country2capitalList)
           ^

从Scala 2.8版本开始,您可以使用 toMap 方法:

scala> val someList = List((1, "one"), (2, "two"))   
someList: List[(Int, java.lang.String)] = List((1,one), (2,two))

scala> someList.toMap
res0: scala.collection.immutable.Map[Int,java.lang.String] = Map((1,one), (2,two))

9
在2.8版本中,您可以使用toMap方法:
scala> val someList = List((1, "one"), (2, "two"))   
someList: List[(Int, java.lang.String)] = List((1,one), (2,two))

scala> someList.toMap
res0: scala.collection.immutable.Map[Int,java.lang.String] = Map((1,one), (2,two))

这适用于任何键值对集合。请注意,文档中对其重复键策略的说明如下:

重复的键将被后面的键覆盖:如果这是一个无序集合,则结果映射中的键未定义。


7
在Scala 2.8中:
scala> import scala.collection.breakOut
import scala.collection.breakOut

scala> val ls = List("a","bb","ccc")
ls: List[java.lang.String] = List(a, bb, ccc)

scala> val map: Map[String,Int] = ls.map{ s => (s,s.length) }(breakOut)
map: Map[String,Int] = Map((a,1), (bb,2), (ccc,3))

scala> val map2: Map[String,Int] = ls.map{ s => (s,s.length) }.toMap
map2: Map[String,Int] = Map((a,1), (bb,2), (ccc,3))

scala>

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