2012-04-30 83 views
3

我正在學習斯卡拉的繩索,並想知道是否有一個簡單的方法來做數組減法。數組減法在斯卡拉

比方說,我有兩個陣列,其中元件的形式爲(K,V):

A: Array((1,2), (2,3), (4,1)) 
B: Array((1,1), (2,3)) 

我想獲得

A - B: Array((1,1), (4,1)) 

相應的鍵應該減去。

任何幫助表示讚賞。提前致謝!

編輯:看起來像「減法」一詞很混亂。我想要做的是減去數組中(K,V)對中匹配鍵的值。

回答

5

如果你的意思是你想從A減去B每一個匹配的密鑰,如果差值爲0,忽略它,那麼這樣做:

val a = Array((1,2), (2,3), (4,1)) 
val b = Array((1,1), (2,3)) 

val bMap = b.toMap 
a.map{ case (k,v) => (k, v - bMap.getOrElse(k,0)) }.filter(_._2 != 0) 
// Array((1,1), (4,1)) 

此過程轉換b的地圖,便於查找。然後我們遍歷a,並且對於每個元素,減去b的該鍵的值(或者0,如果它不存在)。最後,我們刪除結果中值爲0的任何條目。

+0

感謝。但那不會減去他們不是嗎?我想要的答案是((1,1),(4,1)) – Andy

+0

@Andy,你對「減法」的定義是什麼?我認爲你的意思是像設置差異... – dhg

+0

我編輯了這個問題。我想爲數組中的(K,V)對中的匹配鍵減去相應的值。 – Andy

3

這通常是一組操作,所以如果順序不重要,則可以嘗試使用集合。那麼它就像A.toSet -- B.toSet一樣。

0

您可以使用 「表達」 自己:

val a = Array((1,2), (2,3), (4,1)) 
val b = Array((1,1), (2,3)) 

val bMap = b.toMap 
for { 
    (k, v) <- a      // get an element from a 
    nv = v - bMap.getOrElse(k,0) // calculate the new value 
    if (nv > 0)      // filter the 0 values 
} yield (k, nv)     // yield the updated pair