基于scala中的键的值的总和

时间:2017-04-26 07:13:34

标签: scala

我是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

3 个答案:

答案 0 :(得分:2)

使用shapeless将这些元组转换为List[Int]更容易,然后使用它们。无论如何,你的元组实际上更像是列表。另外,作为奖励,您根本不需要为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)

答案 1 :(得分: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)

由于元组无法安全转换为List,因此需要指定逐个添加j._1 + j._2 + j._3

答案 2 :(得分:0)

使用元组中的第一个元素作为键,剩下的元素就像你需要的那样可以做这样的事情:

ContentResolver cr = getContentResolver();
ContentValues values = new ContentValues()
values.put(CalendarContract.Events.DTSTART, DateBuilder.getStartDayCalendar());
values.put(CalendarContract.Events.DTEND, DateBuilder.getEndDayCalendar());
values.put(CalendarContract.Events.TITLE, "Title");
values.put(CalendarContract.Events.DESCRIPTION, "description");
values.put(CalendarContract.Events.CALENDAR_ID, 1);         
values.put(CalendarContract.Events.EVENT_TIMEZONE, TimeZone.getDefault().getID());

Uri uri = cr.insert(CalendarContract.Events.CONTENT_URI, values);

我知道asInstanceOf [Int]有点脏,但是当你做.productIterator时你会得到一个任意的Iterator

这适用于任何元组大小