2015-03-02 43 views
3

这里是代码我写的平均坐标内包含一个地图的价值观中值:取平均数值包含在地图

val averaged = Map((2,10) -> List((2.0,11.0), (5.0,8.0))) 
                //> averaged : scala.collection.immutable.Map[(Int, Int),List[(Double, Double) 
                //| ]] = Map((2,10) -> List((2.0,11.0), (5.0,8.0))) 
averaged.mapValues(m => { 


    val s1 = m.map(m => m._1).sum 
    val s2 = m.map(m => m._2).sum 

    (s1/m.size , s2/m.size) 
})            //> res0: scala.collection.immutable.Map[(Int, Int),(Double, Double)] = Map((2, 
                //| 10) -> (3.5,9.5)) 

此代码工作正常,但mapValues功能需要传球次数等于长度的名单。使用Scala有没有更实用的方法来达到同样的效果?

回答

1

如果我正确理解你的问题,你问是否有可能避免在每个访问上遍历mmapValues方法返回一个Map视图,这意味着将会有重复的访问工作。为了避免这种情况,只需使用map代替:

val averaged = Map((2, 10) -> List((2.0, 11.0), (5.0, 8.0))) 
val result = averaged.map { 
    case (key, m) => 
    val (s1, s2) = m.unzip 
    (s1.sum/m.size, s2.sum/m.size) 
} 
println(result) 
// Map((2,10) -> (3.5,9.5)) 

使用unzip还意味着代码不会遍历一次m更多。

+0

适合我。我刚更新了完整的代码;也许你错过了一些东西。 – dhg 2015-03-02 22:05:49

+0

将解压缩不会被多次调用,因为它包含在mapValues函数中,或者是因为(s1,s2)是解压缩的val会被调用一次? – 2015-03-02 22:07:43