我正在學習斯卡拉的繩索,並想知道是否有一個簡單的方法來做數組減法。數組減法在斯卡拉
比方說,我有兩個陣列,其中元件的形式爲(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)對中匹配鍵的值。
我正在學習斯卡拉的繩索,並想知道是否有一個簡單的方法來做數組減法。數組減法在斯卡拉
比方說,我有兩個陣列,其中元件的形式爲(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)對中匹配鍵的值。
如果你的意思是你想從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的任何條目。
這通常是一組操作,所以如果順序不重要,則可以嘗試使用集合。那麼它就像A.toSet -- B.toSet
一樣。
您可以使用 「表達」 自己:
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
感謝。但那不會減去他們不是嗎?我想要的答案是((1,1),(4,1)) – Andy
@Andy,你對「減法」的定義是什麼?我認爲你的意思是像設置差異... – dhg
我編輯了這個問題。我想爲數組中的(K,V)對中的匹配鍵減去相應的值。 – Andy