2013-02-17 33 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