代码之家  ›  专栏  ›  技术社区  ›  kingledion

合并两个映射时无法添加值

  •  0
  • kingledion  · 技术社区  · 6 年前
    val map1: Map[Int, Double] = ...
    map1 ++ map2.map{ case (k,v: Double) => k -> (v + map1.getOrElse(k,0)) }
    
    [ERROR] ...<code location>...: error: overloaded method value + with alternatives:
    [ERROR]   (x: Double)Double <and>
    [ERROR]   (x: Float)Double <and>
    [ERROR]   (x: Long)Double <and>
    [ERROR]   (x: Int)Double <and>
    [ERROR]   (x: Char)Double <and>
    [ERROR]   (x: Short)Double <and>
    [ERROR]   (x: Byte)Double <and>
    [ERROR]   (x: String)String
    [ERROR]  cannot be applied to (AnyVal)
    [ERROR]         .map{ case (k, v: Double)  => k -> (v + map1.getOrElse(k, 0)) }
    [ERROR]                                               ^
    

    + ,有 v: Double ; 另一个是从一个 Map[Int, Double] Double + Double

    2 回复  |  直到 6 年前
        1
  •  1
  •   RAGHHURAAMM    6 年前

    让我们说,

    val map1 = Map(1->2.0,2->3.0,3->4.0,4->5.0,5->6.0)
    val map2 = Map(1->2.5,3->1.0,4->3.2,7->3.0,6->1.23)
    

     map1 ++ map2.map{ case (k,v: Double) => k -> (v + map1.getOrElse(k,0.0)) }
    

    而不是

    map1 ++ map2.map{ case (k,v: Double) => k -> (v + map1.getOrElse(k,0)) }
    

    你的替代品 Int 0 而不是 Double 0.0 . 这就是为什么 type 退回人 getOrElse 方法被推断为 AnyVal + 未定义为重载 Double + AnyVal . 当两者都是 它将按预期正确推断 + 双倍 s。 盖托莱尔 方法返回 value ( 双倍 key k(Int) k 双倍 只有ie。, 0 安瓦尔 Any 内景 String 作为的第二个参数 盖托莱尔

    在Scala REPL中:

    scala> map1 ++ map2.map{ case (k,v: Double) => k -> (v + map1.getOrElse(k,0.0)) }
    res2: scala.collection.immutable.Map[Int,Double] = Map(5 -> 6.0, 1 -> 4.5, 6 -> 1.23, 2 -> 3.0, 7 -> 3.0, 3 -> 5.0, 4 -> 8.2
    )
    
        2
  •  1
  •   Binzi Cao    6 年前

    这应该可以解决问题:

    map1.getOrElse(k,0:Double) or map1.getOrElse(k,0d)
    

    Any 类型为 0

    scala> map1.getOrElse(1,0)
    res11: AnyVal = 2.0