Scala中的多键映射

knu*_*nub 5 scala key hashmap map scala-collections

如何在Scala中创建一个Map,它不仅将一个参数作为键,而是两个或三个.

val map = //..?
map("abc", 1) = 1
println(map("abc", 2)) // => null
println(map("abc", 1)) // => 1
Run Code Online (Sandbox Code Playgroud)

我尝试使用元组作为键,但后来我必须分配这样的值

map(("abc", 1)) = 1
Run Code Online (Sandbox Code Playgroud)

我可以以某种方式摆脱内部括号吗?

Fel*_*ier 11

你也可以用

map += ("abc", 1) -> 1
Run Code Online (Sandbox Code Playgroud)

如果map键表示某些内容(例如用户信息),并且如果要为代码添加清晰度(特别是如果键中有3个元素),我将使用case类作为键.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"
Run Code Online (Sandbox Code Playgroud)


Lui*_*hys 6

您可以添加自己的增强功能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 }
}
Run Code Online (Sandbox Code Playgroud)

然后

val map = Map(("abc", 1) -> 0)
map("abc", 1) = 1
Run Code Online (Sandbox Code Playgroud)

工作得很好.