我有下面的函数,该函数采用类型为Likes(type Likes=Int
)的方法的数组
以及编号为Likes(likesVector)的数字的RDD。对于likesVector RDD中的每个数字,它计算与均值数组中每个均值的距离,并选择距离最小(val distance = (mean-number).abs
)的均值。当我期望得到Map[Likes,Array[Likes]]
类型的结果时,我得到一个空的映射。 Map[Likes,Array[Likes]]
代表(mean->Array of number-nearest numbers)
。
实现此目标的最佳方法是什么?我怀疑这与Scala集合的可变性有很大关系。
def assignDataPoints(means:Array[Likes],likesVector:RDD[Likes]): Map[Likes,Array[Likes]] ={
var likes_Mean = IntMap(1->1)
var likes_mean_final = mutable.Map.empty[Likes,Array[Likes]]
likesVector.map(dataPoint => {
means.foldLeft(Array.empty[Likes])( (accumulator, mean)=> {
val dist= computeDistance(dataPoint,mean)
val nearestMean = if (dist < accumulator(0)) {
accumulator(0)=dist
accumulator(0)
} else{
accumulator(0)
}
val b= IntMap(nearestMean.toInt -> dataPoint)
println("b:"+ b)
likes_mean_final ++ likes_Mean.intersectionWith(b,(_, av, bv: Likes) => Array(av, bv))
accumulator
})})
likes_mean_final.toMap
}
答案 0 :(得分:0)
清空地图的原因是您在此行中使用++
操作:
likes_mean_final ++ likes_Mean.intersectionWith(b,(_, av, bv: Likes) => Array(av, bv))
++
操作返回一个新映射,因此我们正在创建一个新对象,而不更改当前值
用于更改当前可变映射的操作为++=
。所以你应该使用:
likes_mean_final ++= likes_Mean.intersectionWith(b,(_, av, bv: Likes) => Array(av, bv))
在您的上下文中也无需使用var
,因为您没有将值重新分配给相同的引用。
但是您不应该在Scala中使用可变性。