我正在尝试在 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)
}
(对于我的特殊情况,每个输入映射的值总和为 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.addNMaps(Map(1->1))
返回Map(1->1.0)
?