scala - 按位置总结地图的价值

时间:2017-10-12 23:47:42

标签: scala

我有这样的地图

var kk:scala.collection.mutable.Map[Int,Array[Int]] = Map(2 -> Array(1, 3), 1 -> Array(2, 8), 3 -> Array(4, 5))

我需要的是按位置总结值数组,如numpy数组添加,结果应该像这个数组(1 + 2 + 4,3 + 8 + 5)

2 个答案:

答案 0 :(得分:3)

使用.values获取数组的List.transpose在每个“列”上应用.map时更短一点:

scala> val data = Map(2 -> Array(1, 3), 1 -> Array(2, 8), 3 -> Array(4, 5))
data: scala.collection.immutable.Map[Int,Array[Int]] = Map(2 -> Array(1, 3), 1 -> Array(2, 8), 3 -> Array(4, 5))

scala> data.values.transpose.map(_.sum)
res4: Iterable[Int] = List(7, 16)

如果您想获得.toArray

,请添加Array
scala> data.values.transpose.map(_.sum).toArray
res5: Array[Int] = Array(7, 16)

答案 1 :(得分:0)

您需要在地图上iterate获取地图值的第一个和第二个元素的单独列表。然后应用fold函数。

scala> val data = Map(2 -> Array(1, 3), 1 -> Array(2, 8), 3 -> Array(4, 5))
data: scala.collection.mutable.Map[Int,Array[Int]] = Map(2 -> Array(1, 3), 1 -> Array(2, 8), 3 -> Array(4, 5))

scala> data.map(kv => kv._2.head -> kv._2.last).foldLeft(0, 0)((a, b) => (a._1 + b._1) -> (a._2 + b._2))
res11: (Int, Int) = (7,16)

如果您希望结果在上述结果中明确Array.productIterator.toArray

scala> data.map(kv => kv._2.head -> kv._2.last).foldLeft(0, 0)((a, b) => (a._1 + b._1) -> (a._2 + b._2)).productIterator.toArray
res13: Array[Any] = Array(7, 16)