2011-06-29 22 views
19

は、私は常に自分自身がScalaの地図反復可能

val map = Map(foo.map(x=>(x, f(x)))

を書い見つけしかし、Map.applyだけ変数の引数を取りますので、これは実際に動作しません - 私は

を記述する必要があります

val map = Map(foo.map(x=>(x, f(x)) toSeq :_*)

私が欲しいものを得るには、それは痛いようです。タプルのIterableからMapを構築するにはもっときれいな方法がありますか?

答えて

28

トラバーサブル/イテラブルの要素がTuple2である場合に定義されるTraversableOnce.toMapを使用してください。 (API)

val map = foo.map(x=>(x, f(x)).toMap 
+1

あるいは、 'foo.mapValues(F).toMap'。 – missingfaktor

+0

@missingfaktorはmap以外のクラスにメソッドをマップしますか? – juanchito

+0

@mayonesa、いいえ、私は当時はそれほど良く分かりませんでした! :) – missingfaktor

4

代わりにあなたがmapコールへの暗黙的なCanBuildFrom引数として使用collection.breakOutを使用することができます。予想されるタイプに基づいて結果ビルダーが選択されます。

scala> val x: Map[Int, String] = (1 to 5).map(x => (x, "-" * x))(collection.breakOut) 
x: Map[Int,String] = Map(5 -> -----, 1 -> -, 2 -> --, 3 -> ---, 4 -> ----) 

それは一度だけのコレクションを反復処理としては、.toMapバージョンよりも良好に機能します。

これはそれほど明白ではありませんが、これもまた理解のために機能します。

scala> val x: Map[Int, String] = (for (i <- (1 to 5)) yield (i, "-" * i))(collection.breakOut) 
x: Map[Int,String] = Map(5 -> -----, 1 -> -, 2 -> --, 3 -> ---, 4 -> ----) 
+0

ありがとうございます - 他の人が 'CanBuildFrom'の狂気に対する数多くの説明にリンクして貼り付けることなく読まなければならないコードでは使用しませんが、不変の範囲を 'mutable.Map'に変換します。ここで私が前に受け入れた答えは私に型エラーを与えます。 – themel

2
val map = foo zip (foo map f) toMap 
関連する問題