在Scala中对地图值进行求和和分组

时间:2012-10-26 09:49:07

标签: scala dictionary collections grouping aggregation

我是Scala的新手,我正在寻找一种更简洁的方法来对地图值进行求和和分组。有没有比以下代码更好的方法:

def mapSum(thisMap: Map[Char, Int], thatMap: Map[Char, Int]) = {
  thisMap.transform { (k, v) => thatMap(k) + v }
}

哪个会满足以下测试:

@Test
def mapSum() {
  val map: Map[Char, Int] = Map('C' -> 1, 'D' -> 3)
  val newMap = mapSum(map, map)
  assertEquals(2, newMap('C'))
  assertEquals(6, newMap('D'))
}

1 个答案:

答案 0 :(得分:3)

如果你想要简洁,你不会比使用标准库的当前版本好多了(虽然请注意你可以放下外括号使其成为双线)。

Scalaz提供了一些可以使这种事情更简洁的工具,包括Map的monoid实例和一个拉皮条unionWith方法:

scala> import scalaz._, Scalaz._
import scalaz._
import Scalaz._

scala> val m = Map('C' -> 1, 'D' -> 3)
m: scala.collection.immutable.Map[Char,Int] = Map(C -> 1, D -> 3)

scala> m |+| m
res0: scala.collection.immutable.Map[Char,Int] = Map(C -> 2, D -> 6)

scala> (m unionWith m)(_ + _)
res1: Map[Char,Int] = Map(C -> 2, D -> 6)

请注意,这两种方法的行为与您的方法略有不同,但是如果第一个中的键不在第二个中,它们不会在运行时阻塞,并且它们不会静默地忽略第二个不在第一个。