2012-10-26 44 views
2

我是Scala的新手,我正在寻找更简洁的方式来对地图值进行求和和组合。难道还有比下面的代码更好的方法:在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

如果他们不这样做(就像你正在学习的课程),你应该使用'.withDefault' –

+0

@TravisBrown,他们总是有相同的密钥。 – Caps

回答

3

如果你打算为简洁,你不会得到比你更好当前版本与标准库(尽管请注意,您可以放下外部支架使其成为一个双线)。

Scalaz提供了一些工具,可以让这种事情多了几分简洁,包括Map一个独异实例和拉皮条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) 

注意,这两种方法的行为有所不同比但是,如果第一个键不在第二个键中,那么它们在运行时不会窒息,并且它们不会默默地忽略第二个不在第一个键中的键。

+0

对我很好,谢谢!我不需要它来处理这种情况下丢失的键,但这种解决方案在防御性编程方面更好。 – Caps

+0

@Caps它使用一个名为scalaz的外部库......它不值得引入这个依赖关系,只是为了减少几个字符的代码。当然,使用预编写的函数将会简洁,但导入您自己编写的函数也是如此。 –

+0

@LuigiPlinge:我希望看起来好像我并不想隐藏这个涉及外部库的事实! (当然还有很多其他的原因可以使用Scalaz。) –

相关问题