Scala中的多键映射

时间:2013-02-17 23:27:20

标签: scala map hashmap key scala-collections

如何在Scala中创建一个Map,它不仅将一个参数作为键,而是两个或三个。

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

我尝试使用元组作为键,但是我必须分配像这样的值

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

我可以以某种方式摆脱内部括号吗?

4 个答案:

答案 0 :(得分:11)

您也可以使用

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

如果地图键代表了某些内容(例如用户信息),并且您希望为代码添加清晰度(特别是如果密钥中有3个元素),我会使用案例类作为密钥。 Case类具有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"

答案 1 :(得分:6)

您可以将自己的增强功能添加到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

工作正常。

答案 2 :(得分:3)

你可以使用 - >元组的语法:

map("abc" -> 1) = 1

答案 3 :(得分:0)

我使用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