Map中包含的List中的平均值

时间:2015-03-02 21:49:24

标签: scala

以下是我写的平均坐标值包含在Map的值中的代码:

 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函数要求传递次数等于List的长度。是否有更惯用的方法使用Scala实现相同的目标?

1 个答案:

答案 0 :(得分: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