23

可変マップを更新するこの方法に出くわしたImpatientの本のために、CayHorstmannのScalaを使用しています。

scala> val scores = scala.collection.mutable.Map("Alice" -> 10, "Bob" -> 3, "Cindy" -> 8)
scores: scala.collection.mutable.Map[String,Int] = Map(Bob -> 3, Alice -> 10, Cindy -> 8)

scala> scores("Alice") // retrieve the value of type Int
res2: Int = 10

scala> scores("Alice") = 5 // Update the Alice value to 5

scala> scores("Alice")
res4: Int = 5

scores("Alice")のヒットのようapplyですMapLike.scala。ただし、これは値を返すだけで、更新できるものは返しません。

好奇心から、不変のマップで同じ構文を試したところ、次のエラーが表示されました。

scala> val immutableScores = Map("Alice" -> 10, "Bob" -> 3, "Cindy" -> 8)
immutableScores: scala.collection.immutable.Map[String,Int] = Map(Alice -> 10, Bob -> 3, Cindy -> 8)

scala> immutableScores("Alice") = 5
<console>:9: error: value update is not a member of scala.collection.immutable.Map[String,Int]
              immutableScores("Alice") = 5
          ^

それに基づいて、それscores("Alice") = 5はに変換されるscores update ("Alice", 5)と思いますが、それがどのように機能するのか、あるいはそれがどのように可能であるのかさえわかりません。

それはどのように機能しますか?

4

3 に答える 3

27

これはapplyupdate構文の例です。

map("Something")この呼び出しを呼び出すmap.apply("Something")と、次に呼び出しますget

map("Something") = "SomethingElse"この呼び出しを呼び出すmap.update("Something", "SomethingElse")と、次に呼び出しますput

より完全な説明については、これを見てください。

于 2013-03-24T22:31:01.993 に答える
0

これを試すことができます:=>マップのリストを更新するには

import java.util.concurrent.ConcurrentHashMap
import scala.collection.JavaConverters._
import scala.collection.concurrent

val map: concurrent.Map[String, List[String]] = new ConcurrentHashMap[String, List[String]].asScala

def updateMap(key: String, map: concurrent.Map[String, List[String]], value: String): Unit = {
map.get(key) match {
case Some(list: List[String]) => {
val new_list = value :: list
map.put(key, new_list)
}
case None => map += (key -> List(value))
}
}
于 2018-08-29T11:36:28.950 に答える
-1

問題は、不変のマップを更新しようとしていることです。マップが次のように宣言されたときに同じエラーメッセージが表示されました

var m = new java.util.HashMap[String, Int]

しかし、私が定義をに置き換えたとき

var m = new scala.collection.mutable.HashMap[String, Int]

m.update働いた。

于 2013-11-06T20:14:57.470 に答える