web-dev-qa-db-ja.com

Scalaでは、2つのリストをマップに変換する方法はありますか?

List[A]List[B]の2つのリストがあります。必要なのはMap[A,B]ですが、Zipのセマンティクスが必要です。だから、そのように始めました:

var tuplesOfAB = listOfA Zip listOfB

MapからtuplesOfABを作成する方法がわかりません。

フォローアップの質問として、マップを反転して、Map[A,B]からMap[B,A]を作成できるようにします。誰かが手がかりで私を殴ることはできますか?

27
Andy Hull

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]
31
oxbow_lakes

タプルのリストができたので、Map(tuplesOfAB: _*)と書くことで簡単にマップにすることができます。 _: _*_表記は、シーケンスから取得した引数を使用してvarargsオーバーロードを呼び出すことを意味します。これはおかしな構文のように見えますが、可変引数はMap[A,B](pairs: (A,B)*)のように宣言されており、_: _*_は一般的な_*_のため、可変引数に変換する型アノテーションであると考えると役立ちます。部。

マップを反転するにはmMap(m.map(_.swap): _*)を使用します。 scalaでは、マップもペアのコレクションです。これは、要素を交換してMapコンストラクターに渡すことにより、これらのペアを変換します。

15
Geoff Reedy

すでに示した方法以外にも、それを行う別の方法があります。ここに:

Map() ++ tuplesOfAB
5
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)
4
Ashwin