List[A]
とList[B]
の2つのリストがあります。必要なのはMap[A,B]
ですが、Zip
のセマンティクスが必要です。だから、そのように始めました:
var tuplesOfAB = listOfA Zip listOfB
Map
からtuplesOfAB
を作成する方法がわかりません。
フォローアップの質問として、マップを反転して、Map[A,B]
からMap[B,A]
を作成できるようにします。誰かが手がかりで私を殴ることはできますか?
2.8では、これはCanBuildFrom
機能( Danielによる説明 )を使用し、breakOut
を型結果の型がどうあるべきかについてのコンパイラへの指示:
import scala.collection.breakOut
val m = (listA Zip listB)(breakOut): Map[A,B]
以下も機能します。
val n: Map[A,B] = (listA Zip listB)(breakOut)
そして(以下のEastSunが指摘しているように)これはtoMap
としてライブラリに追加されました
val o = (listA Zip listB).toMap
マップを反転する場合は、次のことができます。
val r = m.map(_.swap)(breakOut): Map[B, A]
タプルのリストができたので、Map(tuplesOfAB: _*)
と書くことで簡単にマップにすることができます。 _: _*
_表記は、シーケンスから取得した引数を使用してvarargsオーバーロードを呼び出すことを意味します。これはおかしな構文のように見えますが、可変引数はMap[A,B](pairs: (A,B)*)
のように宣言されており、_: _*
_は一般的な_*
_のため、可変引数に変換する型アノテーションであると考えると役立ちます。部。
マップを反転するにはm
Map(m.map(_.swap): _*)
を使用します。 scalaでは、マップもペアのコレクションです。これは、要素を交換してMapコンストラクターに渡すことにより、これらのペアを変換します。
すでに示した方法以外にも、それを行う別の方法があります。ここに:
Map() ++ tuplesOfAB
scala> List( "a", "f", "d") Zip List(7, 5, 4, 8) toMap
res0: scala.collection.immutable.Map[Java.lang.String,Int] = Map(a -> 7, f -> 5, d -> 4)