地图的Scala值

时间:2016-04-04 10:38:32

标签: scala

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,它会给我一个测试值列表,但我不确定如何操作。

谢谢!

3 个答案:

答案 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的总和