2012-10-26 74 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。) –

相關問題