2017-04-26 60 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你得到的任何

一个迭代器,这将对于任何元组大小