2013-02-17 35 views
4

如何在Scala中创建一个不仅将单个参数作为关键字,而是将两个或三个参数作为参数的Map。Scala中的多键地图

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

我尝试使用元组作为重点,但我必须分配这样

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

值可我不知摆脱括号内的?

回答

5

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

的作品就好了。

3

您可以使用 - >语法元组:

map("abc" -> 1) = 1 
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" 
+0

是的,还想过使用案例类,但这比括号更加嘈杂。 – knub 2013-02-18 13:26:46

+0

我同意在这种情况下,案例类增加了代码的冗长度。他们将允许更好地键入您的地图并增加代码的清晰度,因为您可以命名该密钥代表的概念。但取决于你的使用情况,它们也可能是过度杀伤性的。 – 2013-02-18 14:50:42

+1

问题在于你无法正确搜索。 – BAR 2015-07-08 00:32:13

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