2013-07-28 10 views
11

まずは、不明な質問に対してお詫び申し上げます。私は宗教的にせっかち」の `スカラ座を読み、すべての演習問題を解決しよう(といくつかの最低限の探査を行っている)ScalaでMap上で `map`関数を使う

背景います: 運動の質問は以下のようになります - セットアップの数の価格のマップあなたが欲するギズモです。その後、同じキーと価格で10%割引で2番目のマップを作成します。

残念ながら、この時点では、scaladocの大部分は、まだ私には謎めいているが、私はMapのマップ機能は、機能を取り、機能(私は推測?)を適用した後に別のマップを返すことを理解 - def map[B](f: (A) ⇒ B): HashMap[B]を。私はグーグルで試みたが、map function for Map in scala

:-)私の質問のために非常に有用な結果を得るcouldntの: を私のバリエーション3で試みとして、何の意味も持たこの目的のために map機能を使用しないか、私はバリエーション2に固執すべき実際に私の問題を解決します。

コード:この場合

val gizmos:Map[String,Double]=Map("Samsung Galaxy S4 Zoom"-> 1000, "Mac Pro"-> 6000.10, "Google Glass"->2000) 

//1. Normal for/yield 
val discountedGizmos=(for ((k,v)<-gizmos) yield (k, v*0.9)) //Works fine 

//2. Variation using mapValues 
val discGizmos1=gizmos.mapValues(_*0.9) //Works fine 

//3. Variation using only map function 
val discGizmos2=gizmos.map((_,v) =>v*0.9) //ERROR : Wrong number of parameters: expected 1 

答えて

15

は、mapValuesは、より適切な方法を使用しているように見えるん。キーの知識が必要な変換を実行する必要がある場合(たとえば、製品リファレンスを製品名に変換するなど)、マップメソッドを使用します。

しかし、mapメソッドは、キーと値の両方にアクセスできるようにするより一般的です。値を変換してキーを渡すだけでmapValuesメソッドをエミュレートすることができます。上のコードで間違っているところです。正しくマップメソッドを使用するには、あなただけのキーではない、あなたの関数から(キー、値)のペアを生成する必要があります。

val discGizmos2=gizmos.map{ case (k,v) => (k,v*0.9) } // pass the key through unchanged 
+0

うわー。それは完璧な意味合いがあります。はっきりと説明する時間を取ってくれてありがとう。 –

+1

'mapValues'は既存のマップ上にビューを作成するのに対して、' map'は新しいマップ全体を作成することに注意してください。 – Daenyth

4

はまたすることができ:

val discGizmos2 = gizmos.map(kv => (kv._1, kv._2*0.9)) 
+0

ニース。私はScalaがあなたが1つ以上の方法で同じことをすることを許す方法が大好きです。ありがとう!! –

+0

これはタプルを使用するのと同じです。つまり、kvは単なるタプルです。 – piyushGoyal