2015-03-02 72 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