以下是我写的平均坐标值包含在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实现相同的目标?
答案 0 :(得分:1)
如果我正确理解您的问题,您会问是否可以避免在每次访问上遍历m
。 mapValues
方法返回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
。