新的
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
我想创建一个Map of Map
a – > 40
b – > 25
我知道我可以在列表中使用group by,它会给我一个测试值列表,但我不知道如何操作.
谢谢!
解决方法
使用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属性,然后对它们求和:
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-part(即使之前将其分配给val).要获得仅包含结果的普通Map,可以在其上调用view.force:
scala> list.groupBy(_.shareClass).mapValues(_.map(_.noOfShares).sum).view.force res2: scala.collection.immutable.Map[String,a -> 40)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。