Scala foldLeft是否再添加一个元素?

Scala foldLeft是否再添加一个元素?,scala,Scala,我正试图在scala中创建一个即时的稀疏向量库,我遇到了foldLeft的一个问题,它似乎在长度为1的序列上创建或添加了一个额外的元素 这是我的稀疏加法函数: def addTwoMaps(m1: Map[Int,Double], m2: Map[Int,Double]) = m1 ++ m2.map{ case (k,v) => k -> (v + m2.getOrElse(k, 0.)) } def addNMaps(ms : Map[Int, Double]*) =

我正试图在scala中创建一个即时的稀疏向量库,我遇到了foldLeft的一个问题,它似乎在长度为1的序列上创建或添加了一个额外的元素

这是我的稀疏加法函数:

  def addTwoMaps(m1: Map[Int,Double], m2: Map[Int,Double]) =
  m1 ++ m2.map{ case (k,v) => k -> (v + m2.getOrElse(k, 0.)) }
def addNMaps(ms : Map[Int, Double]*) = {
val denom = if (ms.length > 0) ms.length.toDouble else 1
ms.foldLeft(Map.empty[Int, Double])((a,b) => addTwoMaps(a,b)).mapValues(_ / denom)
}
这是我的“添加映射序列/稀疏向量并规格化”函数:

  def addTwoMaps(m1: Map[Int,Double], m2: Map[Int,Double]) =
  m1 ++ m2.map{ case (k,v) => k -> (v + m2.getOrElse(k, 0.)) }
def addNMaps(ms : Map[Int, Double]*) = {
val denom = if (ms.length > 0) ms.length.toDouble else 1
ms.foldLeft(Map.empty[Int, Double])((a,b) => addTwoMaps(a,b)).mapValues(_ / denom)
}
(对于我的特殊情况,每个输入映射的值总和为1,因此我所要做的就是除以参数序列的长度,以确保结果映射的值总和为1)

作为一个测试用例,如果我添加两个值之和为1的映射,结果很好:

scala> Common.addNMaps(Map(1->1), Map(1->1))
res34: scala.collection.immutable.Map[Int,Double] = Map(1 -> 1.0)
但如果我只有一个论点:

scala> Common.addNMaps(Map(1->1))
res33: scala.collection.immutable.Map[Int,Double] = Map(1 -> 2.0)
这些值突然相加为两个!我的猜测是单个
Map(1->1)
foldLeft
中被添加了两次,但这只是一个猜测


我做错了什么?我如何获得
Common.addnmap(Map(1->1))
以返回
Map(1->1.0)

您的
addtwomap
中有一个输入错误,应该是:

def addTwoMaps(m1: Map[Int,Double], m2: Map[Int,Double]) =
  m1 ++ m2.map{ case (k,v) => k -> (v + m1.getOrElse(k, 0.)) }
您需要在
m1
上调用
getOrElse
,而不是
m2


请注意,在这种情况下,您可以使用,它有一个方便的
unionWith
方法(可能是受以下启发):


我不确定为什么
unionWith
不是标准Scala
Map
API的一部分。

您的
addTwoMaps
中有一个输入错误,应该是:

def addTwoMaps(m1: Map[Int,Double], m2: Map[Int,Double]) =
  m1 ++ m2.map{ case (k,v) => k -> (v + m1.getOrElse(k, 0.)) }
您需要在
m1
上调用
getOrElse
,而不是
m2


请注意,在这种情况下,您可以使用,它有一个方便的
unionWith
方法(可能是受以下启发):


我不知道为什么
unionWith
不是标准Scala
Map
API的一部分。

D'oh!是的,一切都解决了。谢谢哦!是的,一切都解决了。谢谢