我正在学习 Scala 的技巧,并且想知道是否有一种简单的方法来进行数组减法。
假设我有两个数组,其中元素的形式为 (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) 对中匹配键的值。
我正在学习 Scala 的技巧,并且想知道是否有一种简单的方法来进行数组减法。
假设我有两个数组,其中元素的形式为 (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.toSet -- B.toSet
.
如果您的意思是要为每个匹配的键从 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 的条目。
您可以使用“for 表达式”来做到这一点:
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