scala的新功能..我想计算List中所有元素的总和,它是地图的值。
case class Test(shareClass:String, noOfShares:Long){}
val list = new Test("a", 10)::new Test("b",20)::new Test("a",30)::new Test("b", 5)::Nil
我想创建一个地图
a - > 40个
b - > 25
我知道我可以在列表中使用group by,它会给我一个测试值列表,但我不确定如何操作。
谢谢!
答案 0 :(得分:7)
使用groupBy
创建Map
,其中值是所有匹配对象的列表:
scala> list.groupBy(_.shareClass)
res0: scala.collection.immutable.Map[String,List[Test]] = Map(b -> List(Test(b,20), Test(b,5)), a -> List(Test(a,10), Test(a,30)))
从那里,您可以使用mapValues
转换地图的值,首先选择noOfShares
属性,然后选择sum
这些:
scala> list.groupBy(_.shareClass).mapValues(_.map(_.noOfShares).sum)
res1: scala.collection.immutable.Map[String,Long] = Map(b -> 25, a -> 40)
请注意mapValues
only creates a view on the original Map
,这意味着_.map(_.noOfShares).sum
- 每次访问结果时都会应用(即使之前将其分配给val
) 。要获得仅包含结果的普通Map
,您可以在其上调用view.force
:
scala> list.groupBy(_.shareClass).mapValues(_.map(_.noOfShares).sum).view.force
res2: scala.collection.immutable.Map[String,Long] = Map(b -> 25, a -> 40)
答案 1 :(得分:4)
你走了。
case class Test(shareClass: String, noOfShares: Long) {}
val list = new Test("a", 10) :: new Test("b", 20) :: new Test("a", 30) :: new Test("b", 5) :: Nil
val list2 = list.groupBy((_.shareClass))
.map({ case (a, b) => (a, b.map(_.noOfShares).sum) })
println((list2)) // Map(b -> 25, a -> 40)
答案 2 :(得分:0)
case class Test(shareClass: String, noOfShares: Long) {}
val list = Test("a", 10) :: Test("b", 20) :: Test("a", 30) :: Test("b", 5) :: Nil
println(list.groupBy(_.shareClass).map(test => (test._1 -> test._2.foldLeft(0L)((o, n) => o + n.noOfShares))))
首先,您使用groupBy创建组,如下所示:
Map(b -> List(Test(b,20), Test(b,5)), a -> List(Test(a,10), Test(a,30)))
之后你将元素的值转换为Test的noOfShares的总和