2017-10-12 52 views
0
位置

地圖的值我有這樣階 - 總結通過

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)

回答

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) 
+0

@chunjef感謝格式:) – Ossip

0

您需要通過地圖0​​才能獲取地圖值的第一個和第二個元素的單獨列表。然後應用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)