2017-04-26 62 views
1

我是新來斯卡拉鍵我有一個整數總和基於Scala的

val list = List((1,2,3),(2,3,4),(1,2,3))  
val sum = list.groupBy(_._1).mapValues(_.map(_._2)).sum  
val sum2 = list.groupBy(_._1).mapValues(_.map(_._3)).sum 

的名單如何執行的N值上面我試過,但它不是好辦法如何總結的N值基於關鍵

而且我已經試過這樣

val sum =list.groupBy(_._1).values.sum => error 

val sum =list.groupBy(_._1).mapvalues(_.map(_._2).sum (_._3).sum) error 
+0

工作,你有一個元組列表,關鍵是什麼?第一個元素?另外,你想總結什麼? –

+0

我想第一個元素作爲一個鍵仍然都是基於鍵的值我想爲值執行求和 – Ravi

+0

你想基於元素位置的總和還是所有值的總和?第一個元素的含義'(1,(4,6))'?或所有值的總和? –

回答

2

將這些元組轉換爲List[Int]shapeless然後使用它們更容易。無論如何,你的元組更像是列表。此外,作爲獎勵,你不需要改變你的代碼的Tuple4Tuple5列表等

import shapeless._, syntax.std.tuple._ 
val list = List((1,2,3),(2,3,4),(1,2,3)) 
list.map(_.toList) // convert tuples to list 
    .groupBy(_.head) // group by first element of list 
    .mapValues(_.map(_.tail).map(_.sum).sum) // sums elements of all tails 

結果Map(2 -> 7, 1 -> 10)

+0

但是在這裏,我不能改變tolien這是給錯誤 – Ravi

+0

@Ravi你應該使用無形庫作爲依賴能夠運行這個例子。如果您使用SBT或Maven,您可以檢查github.com/milessabin/shapeless以查找,如何操作。如果你不使用它們,你應該手動添加無形的jar到你的類路徑中。 –

0
val sum = list.groupBy(_._1).map(i => (i._1, i._2.map(j => j._1 + j._2 + j._3).sum)) 
> sum: scala.collection.immutable.Map[Int,Int] = Map(2 -> 9, 1 -> 12) 

由於元組不能典型e安全轉換爲List,需要指定加一個爲j._1 + j._2 + j._3

0

使用的元組作爲重點,並第一個元素剩餘的元素,因爲你需要,你可以做這樣的事情是什麼:

val list = List((1,2,3),(2,3,4),(1,2,3)) 
list: List[(Int, Int, Int)] = List((1, 2, 3), (2, 3, 4), (1, 2, 3)) 

val sum = list.groupBy(_._1).map { case (k, v) => (k -> v.flatMap(_.productIterator.toList.drop(1).map(_.asInstanceOf[Int])).sum) } 
sum: Map[Int, Int] = Map(2 -> 7, 1 -> 10) 

我知道它有點髒做asInstanceOf [INT]但是當你做.productIterator你得到的任何

一個迭代器,這將對於任何元組大小