2

在 Scala 中以适当的功能方式在 Java 中执行以下代码的最佳方法是什么?

LinkedList<Item> itemsInRange = new LinkedList<Item>();
for (int y = 0; y < height(); y++) {
    for (int x = 0; x < width(); x++) {
        Item it = myMap.getItemAt(cy + y, cx + x);
        if (it != null)
            itemsInRange.add(it);
    }
}

// iterate over itemsInRange later

当然,它可以以命令式的方式直接翻译成 Scala:

val itemsInRange = new ListBuffer[Item]
for (y <- 0 until height) {
    for (x <- 0 until width) {
        val it = tileMap.getItemAt(cy + x, cx + x)
        if (!it.isEmpty)
            itemsInRange.append(it.get)
    }
}

但我想以适当的、实用的方式来做。

我认为应该map在某种二维范围内进行操作。理想情况下,map将执行一个函数,该函数将获取xy作为输入参数和输出Option[Item]。在那之后,我会得到类似的东西Iterable[Option[Item]],然后flatten它会 yield Iterable[Item]。如果我是对的,那么唯一缺少的就是以某种方式在 2D 范围内进行地图操作。

4

1 回答 1

7

您可以通过一个不错的步骤完成这一切:

def items[A](w: Int, h: Int)(at: ((Int, Int)) => Option[A]): IndexedSeq[A] =
  for {
    x <- 0 until w
    y <- 0 until h
    i <- at(x, y)
  } yield i

现在假设我们在一个四乘四的板上有这种符号表示:

val tileMap = Map(
  (0, 0) -> 'a,
  (1, 0) -> 'b,
  (3, 2) -> 'c
)

我们只写:

scala> items(4, 4)(tileMap.get)
res0: IndexedSeq[Symbol] = Vector('a, 'b, 'c)

我认为这是你想要的。

于 2012-12-13T17:53:11.800 回答