【问题标题】:Multi-key Map in ScalaScala中的多键映射
【发布时间】:2013-02-02 08:32:09
【问题描述】:

如何在 Scala 中创建一个不仅将单个参数作为键,而且将两个或三个参数作为键的 Map。

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

我尝试使用元组作为键,但是我必须像这样分配值

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

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

【问题讨论】:

    标签: scala map hashmap key scala-collections


    【解决方案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"
    

    【讨论】:

    • 是的,也考虑过使用案例类,但这比括号更吵。
    • 我同意案例类在这种情况下会增加代码的冗长性。它们将允许更好地键入您的地图并增加代码的清晰度,因为您可以命名键所代表的概念。但根据您的用例,它们也可能是矫枉过正。
    • 问题在于您无法正确搜索。
    【解决方案2】:

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

      【讨论】:

        【解决方案4】:

        我在使用 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
        

        【讨论】:

          猜你喜欢
          • 2015-09-14
          • 2011-01-12
          • 2012-02-26
          • 1970-01-01
          • 2018-09-25
          • 2010-11-12
          • 1970-01-01
          • 1970-01-01
          • 2011-11-12
          相关资源
          最近更新 更多