如何使用A值作为地图中的关键字将Seq [A]转换为Map [Int,A]?

Jes*_*per 37 scala scala-2.8 scala-collections

我有一个Seq类的对象,如下所示:

class A (val key: Int, ...)
Run Code Online (Sandbox Code Playgroud)

现在我想将此转换Seq为a Map,使用key每个对象的值作为键,并将对象本身作为值.所以:

val seq: Seq[A] = ...
val map: Map[Int, A] = ... // How to convert seq to map?
Run Code Online (Sandbox Code Playgroud)

如何在Scala 2.8中高效且优雅地完成这项工作?

Set*_*sue 66

由于Scala已经有2.8 .toMap,所以:

.toMap

或者如果你想避免构建一个中间序列的元组:

.toMap

  • 在这里找到了"breakOut"的一个很好的解释:http://stackoverflow.com/questions/1715681/scala-2-8-breakout/1716558#1716558 (3认同)

Dan*_*wak 39

映射到你的Seq并生成一系列元组.然后使用这些元组创建一个Map.适用于所有版本的Scala.

val map = Map(seq map { a => a.key -> a }: _*)
Run Code Online (Sandbox Code Playgroud)

  • 使用`breakOut`作为Seth Tisue在另一个答案中显示,可以通过避免创建一个临时的元组序列来提高效率. (3认同)

ret*_*nym 7

另外一个2.8变化,为了更好的衡量,也有效:

scala> case class A(key: Int, x: Int)
defined class A

scala> val l = List(A(1, 2), A(1, 3), A(2, 1))
l: List[A] = List(A(1,2), A(1,3), A(2,1))

scala> val m: Map[Int, A] = (l, l).zipped.map(_.key -> _)(collection.breakOut)
m: Map[Int,A] = Map((1,A(1,3)), (2,A(2,1)))
Run Code Online (Sandbox Code Playgroud)

请注意,如果您有重复的密钥,您将在创建地图时丢弃其中一些密钥!您可以使用groupBy创建一个地图,其中每个值都是一个序列:

scala> l.groupBy(_.key)
res1: scala.collection.Map[Int,List[A]] = Map((1,List(A(1,2), A(1,3))), (2,List(A(2,1))))
Run Code Online (Sandbox Code Playgroud)