How to convert a Seq[A] to a Map[Int, A] using a value of A as the key in the map?
Since 2.8 Scala has had .toMap
, so:
val map = seq.map(a => a.key -> a).toMap
or if you're gung ho about avoiding constructing an intermediate sequence of tuples:
val map: Map[Int, A] = seq.map(a => a.key -> a)(collection.breakOut)
Map over your Seq
and produce a sequence of tuples. Then use those tuples to create a Map
. Works in all versions of Scala.
val map = Map(seq map { a => a.key -> a }: _*)
One more 2.8 variation, for good measure, also efficient:
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)))
Note that if you have duplicate keys, you'll discard some of them during Map creation! You could use groupBy
to create a map where each value is a sequence:
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))))