如何在Scala中创建一个不仅将单个参数作为关键字,而是将两个或三个参数作为参数的Map。Scala中的多键地图
val map = //..?
map("abc", 1) = 1
println(map("abc", 2)) // => null
println(map("abc", 1)) // => 1
我尝试使用元组作为重点,但我必须分配这样
map(("abc", 1)) = 1
值可我不知摆脱括号内的?
如何在Scala中创建一个不仅将单个参数作为关键字,而是将两个或三个参数作为参数的Map。Scala中的多键地图
val map = //..?
map("abc", 1) = 1
println(map("abc", 2)) // => null
println(map("abc", 1)) // => 1
我尝试使用元组作为重点,但我必须分配这样
map(("abc", 1)) = 1
值可我不知摆脱括号内的?
您可以添加自己的增强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
你也使用
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"
我用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
是的,还想过使用案例类,但这比括号更加嘈杂。 – knub 2013-02-18 13:26:46
我同意在这种情况下,案例类增加了代码的冗长度。他们将允许更好地键入您的地图并增加代码的清晰度,因为您可以命名该密钥代表的概念。但取决于你的使用情况,它们也可能是过度杀伤性的。 – 2013-02-18 14:50:42
问题在于你无法正确搜索。 – BAR 2015-07-08 00:32:13