2012-10-26 4 views
2

저는 스칼라 초보자이며지도 값을 합계 및 그룹화하는보다 간결한 방법을 찾고 있습니다. 다음 코드보다 더 좋은 방법이 있나요 : 다음 테스트를 충족시킬 스칼라의지도 값 합계 및 그룹화

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

그들이하지 않는 경우 (coursera 코스에서와 같이), 당신은'.withDefault'를 사용해야합니다 –

+0

@TravisBrown 그들은 항상 같은 열쇠를 가지고 있습니다. – Caps

답변

3

당신이 간결을위한 거라면, 당신은 당신보다 훨씬 나아하지 않을거야 현재 버전을 표준 라이브러리와 함께 사용합니다 (단, 바깥 괄호를 삭제하여 두 줄로 만들 수 있습니다). 이러한 접근 방식 모두 다르게보다 약간 행동하는 것이

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) 

참고 :

Scalaz

Map을위한 모노 이드 인스턴스와 포주 unionWith 방법을 포함하여 이런 종류의 일이 좀 더 간결하게 만들 수있는 몇 가지 도구를 제공합니다 두 번째 키가 아닌 첫 번째 키가 있으면 런타임에 숨 막히지 않고 첫 번째 키가 아닌 두 번째 키를 자동으로 무시하지 않습니다.

+0

감사합니다. 이 경우 누락 된 키를 처리 할 필요가 없지만이 솔루션은 방어 프로그래밍 측면에서 더 좋습니다. – Caps

+0

@Caps 이것은 scalaz라는 외부 라이브러리를 사용합니다. 코드를 몇 문자 줄이려면이 종속성을 도입 할 필요가 없습니다. 물론 미리 작성된 함수를 사용하는 것은 간결 할 것이지만 직접 작성한 함수를 가져 오는 것입니다. –

+0

@LuigiPlinge : 외부 라이브러리가 관련되어 있다는 사실을 숨기려고하는 것 같지 않습니다. (물론 Scalaz를 사용하는 다른 많은 이유가 있습니다.) –