如何在 Scala 中创建一个不仅将单个参数作为键,而且将两个或三个参数作为键的 Map。
val map = //..?
map("abc", 1) = 1
println(map("abc", 2)) // => null
println(map("abc", 1)) // => 1
我尝试使用元组作为键,但是我必须像这样分配值
map(("abc", 1)) = 1
我可以以某种方式摆脱内括号吗?
如何在 Scala 中创建一个不仅将单个参数作为键,而且将两个或三个参数作为键的 Map。
val map = //..?
map("abc", 1) = 1
println(map("abc", 2)) // => null
println(map("abc", 1)) // => 1
我尝试使用元组作为键,但是我必须像这样分配值
map(("abc", 1)) = 1
我可以以某种方式摆脱内括号吗?
你也可以使用
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"
您可以添加自己的增强功能来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
工作得很好。
您可以对元组使用 -> 语法:
map("abc" -> 1) = 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