45

Seq次のようなクラスの包含オブジェクトがあります。

class A (val key: Int, ...)

ここで、各オブジェクトの値をキーとして、オブジェクト自体を値として使用して、これSeqをに変換したいと思います。そう:Mapkey

val seq: Seq[A] = ...
val map: Map[Int, A] = ... // How to convert seq to map?

Scala 2.8でこれを効率的かつエレガントな方法で行うにはどうすればよいですか?

4

4 に答える 4

87

2.8 Scala には が.toMapあるので、次のようになります。

val map = seq.map(a => a.key -> a).toMap

または、タプルの中間シーケンスを構築することを避けたい場合は、Scala 2.8 から 2.12 で:

val map: Map[Int, A] = seq.map(a => a.key -> a)(collection.breakOut)

または Scala 2.13 および 3 ( はありませんがbreakOut、信頼できる があります.view):

val map = seq.view.map(a => a.key -> a).toMap
于 2010-05-27T23:05:39.443 に答える
45

あなたの上にマップしSeq、一連のタプルを生成します。次に、それらのタプルを使用してMap. Scala のすべてのバージョンで動作します。

val map = Map(seq map { a => a.key -> a }: _*)
于 2010-05-27T22:08:38.960 に答える
7

もう 1 つの 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)))

重複したキーがある場合は、マップの作成中にそれらの一部を破棄することに注意してください! 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))))
于 2010-05-28T04:51:13.667 に答える