6

キーとして単一のパラメータだけでなく、2 つまたは 3 つのパラメータを取る Map を Scala で作成するにはどうすればよいですか。

val map = //..?
map("abc", 1) = 1
println(map("abc", 2)) // => null
println(map("abc", 1)) // => 1

タプルをキーとして使用しようとしましたが、次のように値を割り当てる必要があります

map(("abc", 1)) = 1

どうにかして内括弧を取り除くことはできますか?

4

4 に答える 4

12

使用することもできます

map += ("abc", 1) -> 1

マップ キーが何か (ユーザー情報など) を表し、コードを明確にしたい場合 (特にキーに 3 つの要素がある場合)、キーとしてケース クラスを使用します。ケース クラスには equals と hashcode が実装されているため、マップ内のキーとして安全に使用できます。ただし、コードはより冗長になります。

case class MapKey(s: String, i: Int, d: Double)

val map = Map[MapKey, X](MapKey("a", 1, 1.1) -> "value1", MapKey("b", 2, 2.2) -> "value2")

val map2 = map + (MapKey("c", 3, 3.3) -> "value3")

//or for mutable map
map(MapKey("d", 4, 4.4)) = "value4"
//or
map += MapKey("e", 5, 5.5) -> "value5"
于 2013-02-18T02:01:40.583 に答える
7

Mapトリックを実行する独自の拡張機能を追加できます。

import collection.mutable.Map

implicit class EnhancedMap[A,B,C](m: Map[(A,B),C]) {
  def update(a: A, b: B, c: C) { m((a,b)) = c }
}

それから

val map = Map(("abc", 1) -> 0)
map("abc", 1) = 1

うまく動作します。

于 2013-02-18T02:06:22.727 に答える
3

タプルには -> 構文を使用できます。

map("abc" -> 1) = 1
于 2013-02-17T23:30:24.977 に答える
1

Luigi Plinge のアプローチを使用してコンパイル エラーが発生しました。次のアプローチは私にとってはうまくいきますが、これはより簡単です。

scala> var b = Map[(Int, Int), Int]()
b: scala.collection.mutable.Map[(Int, Int),Int] = Map()

scala> b = b + ((1,1)->2)
b: scala.collection.mutable.Map[(Int, Int),Int] = Map((1,1) -> 2)

scala> b
res15: scala.collection.mutable.Map[(Int, Int),Int] = Map((1,1) -> 2)

scala> b = b + ((1,2)->2)
b: scala.collection.mutable.Map[(Int, Int),Int] = Map((1,1) -> 2, (1,2) -> 2)

scala> b(1,1)
res16: Int = 2

scala> b(1,2)
res17: Int = 2
于 2016-12-29T15:55:36.767 に答える