如何在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