1

varsを使用せずに不変マップに追加するにはどうすればよいですか?不変を新しい値にバインドする方法は?次のコードを試すと、エラーが発生します。

"reassignment to val"

私のコード:

object Play {

  def main(args: Array[String]): Unit = {
          test1()
  }

  def test1() {
val pairs = Array(("a", 1), ("b", 2), ("c", 3), ("d", 4))
val m = Map[String, Int]()

for (x <- pairs) {
    m = addToMap (x, m)
}
  }

  def addToMap(pair: (String, Int), map: Map[String, Int]): Map[String, Int] = {
      map + (pair._1 -> pair._2)
  }

}
4

4 に答える 4

2

不変のマップを再割り当てする場合は、それをvarにする必要があります。

var m = Map[String, Int]()
于 2013-03-24T12:17:05.277 に答える
2

または、次のような可変データ構造を使用します。

scala.collection.mutable.Map

ただし、変数の再割り当てを解除することはできません。

于 2013-03-24T13:44:57.013 に答える
2

いくつかのオプションがあります。

最も一般的なアプローチはvar、構造を構築するときにを使用することです。これは多くの場合、最も単純で最も読みやすいアプローチです

もう1つは、再帰関数呼び出しを直接記述するか、のようなものを使用して、再帰構造を使用することですfold。(通常、独自の反復を行うのではなく、折り畳みやマップなどの標準関数を使用することをお勧めします。)

もう1つの便利なイディオムは、toMapのようなものを使用することです。これは、既存の配列がある場合についてはすでに説明しましたが、foreachループ(または同等の関数)と組み合わせて使用​​することもできます。例えば、

( for (x <- xs)
  yield (toKey(x), toVal(y))
).toMap

値が静的である場合は、次のようにすることもできます。

Map("a" -> 1, "b" -> 2, "c" -> 3, "d" -> 4)

個人的には、一時的なローカルマップを使用している場合は、可変マップが最も適切であることがよくあります。関数型の方法で物事を行う方法を理解することは価値があり、誰もがHaskellを学ぶべきだと思いますが、Scalaのm(x) = y可変マップの構文は、非常に単純で簡潔なコードにつながることがよくあります。

Scalaは意図的に混合パラダイム言語です。私の推奨事項は、最初に不変で機能的なアプローチに到達することですが、スレッドが含まれていない限り、命令型の機能を使用して物事を単純化することを恐れないでください。

于 2013-05-21T06:08:33.847 に答える
1

必要なのはからArrayへの変換だけですMap

val pairs = Array(("a", 1), ("b", 2), ("c", 3), ("d", 4))
val m = pairs.toMap
于 2013-03-24T17:14:04.960 に答える