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) }
而第二个是使用 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
我的问题是两方的。
第 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) }
而第二个是使用 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