2017-06-07 6 views
0

私は問題に直面しています: 内部の1つの要素を変更したいのですが、コードがすべての要素を変更しています。 私は間違ったことをする必要があります。 は、ここで私が持っているものです。スカラ:地図内のリスト内の値を変更

var critics: Map[String, List[(String, Double)]] = Map(
    "First" -> List(("a", 1.0), ("b", 2.0)), 
    "Second" -> List(("c", 3.0), ("d", 4.0)) 
) 

    def setNewRating(keyMap: String, param1: String, newRating: Double) = { 
    val newList = critics(keyMap).map{case (param1, _) => (param1, newRating); case x => x} 
    critics = critics + (keyMap -> newList) 
    } 

    println(critics) 

    setNewRating("First", "b", 5.0) 

    println(critics) 

をので、私は「最初」のキーを探していると私は2.0から5.0までが、私は取得しています結果は「b」を変更したいリストを取得しています:

critics: Map[String,List[(String, Double)]] = Map(First -> List((a,1.0), (b,2.0)), Second -> List((c,3.0), (d,4.0))) 
setNewRating: (keyMap: String, param1: String, newRating: Double)Unit 
Map(First -> List((a,1.0), (b,2.0)), Second -> List((c,3.0), (d,4.0))) 
Map(First -> List((a,5.0), (b,5.0)), Second -> List((c,3.0), (d,4.0))) 

コードがすべての値を変更しました!

ありがとうございます。

答えて

1

あなたはバッククォートでparam1を配置する必要があります。

def setNewRating(keyMap: String, param1: String, newRating: Double) = { 
    val newList = critics(keyMap) 
    .map { 
     case (`param1`, _) => param1 -> newRating 
     case x => x 
    } 
    critics = critics + (keyMap -> newList) 
    } 

問題はcase (param1, _)は「何も一致して、新しいローカル変数param1に値を格納」を意味していることです。それはあなたが望むものではありません。一方

case (`param1`, _) => 

、「外側の変数param1と同じ値に一致する」を意味します。

また、param1の名前をParam1に変更した場合も同様です(明らかに、大文字で始まるものはすべて定数であると見なされます)。私はあなたがそれを行うことを示唆していません、完全性のためにそれを言及するだけです。ちょうどバッククックを使用してください。

(また、このようなvarを使用すると、私はうんざりになり、あなたが本当にそれを回避する方法を見つける必要がありますが、それはあなたの質問ではなかった...)

+0

はい、私もこのVaRの事を好きではないが、私は、私は「Scalaの道」(私はJavaのバックグラウンドを持っている)でそれを行うことができますかわからないの参照を見つけることができます!メソッドから新しいMapを返すかもしれませんか? – MLeiria

+0

はい、新しい地図を返します。また、それを入力として渡すことは良いアイデアです(「良い」関数は副作用を引き起こさず、外部からのデータに依存しません):println(setNewRating(critics、 "First"、 "b"、5 )) ') – Dima

1

これは動作するはずです。 case節.map{case (param1, _)で使用するparam1は、引数で定義されているのと同じ変数param1ではありません。新しい変数param1には、メソッドの引数をシャドウするTuple2の最初の要素の値が割り当てられています。

def setNewRating(keyMap: String, param1: String, newRating: Double) = { 
    val newList = critics(keyMap) map { 
    case (x, _) if x == param1 => (param1, newRating) 
    case x => x 
    } 
    critics = critics + (keyMap -> newList) 
} 
0

あなたはSetListから変更することが喜んでいる場合あなたはただMultiMap形質が欠けているかもしれません。

キーに複数の値が割り当てられた可変マップの特性。

このクラスは、通常、ミックスインとして使用されます。これはAをSet [B]オブジェクトにマッピングするマップを、AをBオブジェクトにマップするマルチマップに変換します。

あなたはhere

関連する問題