Scala:对 ArrayBuffer 的所有元素应用线性运算,并检查边界

Scala: Applying a linear operation on all elements of an ArrayBuffer, and also checking bounds

我的问题是两方的。

第 1 部分

我有一个 ArrayBuffer 个元组 (x,y)。我有一个元组 (deltaX,deltaY),它看起来像 (-1,0)(作为示例)以指定要应用于 ArrayBuffer.

的所有元组的更改

在 Python 中会是这样的:

newBuffer = [(x+deltaX,y+deltaY) for x,y in oldBuffer]

第 2 部分

有没有办法检查 ArrayBuffer 中所有项目的条件?在我的例子中,我希望确保所有坐标都在范围内,所以类似于(再次使用 Python 等价物):

if all(0<=x<xBound and 0<=y<yBound for x,y in buffer)

我可以用很多又长又烦人的代码来完成所有这些事情,但我想知道是否有更聪明的方法。

第一个很简单map:

val (dx, dy) = (-1, 0)
val (xBound, yBound) = (4, 3)
val tuples = Array(1 -> 2, 2 -> 4, 3 -> 0)

tuples.map { case (x, y) => (x + dx, y + dy) }

而第二个是使用 existsforall:

tuples.exists { case (x, y) => x >= xBound || y >= yBound }
tuples.forall { case (x, y) => x < xBound && y < yBound }

您可能还想使用 filter 然后检查 isEmpty,或 nonEmpty:

tuples.filter { case (x, y) => x < xBound && y < yBound }.isEmpty
tuples.filter { case (x, y) => x >= xBound || y > yBound }.nonEmpty

Scala 有许多您可能会遇到的语法选择。以下是一些示例:

tuples.map(tuple => (tuple._1 + dx) -> (tuple._2 + dy))
tuples forAll { tuple =>
    val (x, y) = tuple
    x < xBound && y < yBound
}
tuples.filter(_._1 < xBound).filter(_._2 < yBound).isEmpty

for { (x, y) <- tuples } yield (x + dx, y + dy)

(for {
    (x, y) <- tuples
    if x < xBound
    if y < yBound
} yield (x, y)).isEmpty