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

时间:2015-06-30 00:45:30

标签: list scala arraybuffer

我的问题是两个人。

第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)

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

1 个答案:

答案 0 :(得分:1)

第一个是简单的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,然后检查isEmptynonEmpty

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