我的问题是两个人。
我有ArrayBuffer
个元组(x,y)
。我有一个元组(deltaX,deltaY)
,它看起来像(-1,0)
(作为示例),用于指定要应用于ArrayBuffer
的所有元组的更改。
在Python中,它将类似于:
newBuffer = [(x+deltaX,y+deltaY) for x,y in oldBuffer]
有没有办法检查ArrayBuffer
中所有项目的条件?在我的情况下,我希望确保所有坐标都在边界内,所以类似于(再次使用Python等价物):
if all(0<=x<xBound and 0<=y<yBound for x,y in buffer)
我可以使用许多非常冗长且烦人的代码来完成所有这些事情,但我想知道是否有更聪明的方法。
答案 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) }
第二个是使用exists
或forall
:
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