2

Javaで次のコードを適切に機能する方法で実行するためのScalaでの最良の方法は何ですか?

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ある種の2D範囲で操作が必要だと思います。理想的には、入力パラメータおよび出力としておよびmapを取得する関数を実行します。その後、次のようなものを取得します。それ以上は yield になります。私が正しければ、パズルの唯一の欠けているピースは、何らかの方法で 2D 範囲でそのマップ操作を行うことです。xyOption[Item]Iterable[Option[Item]]flattenIterable[Item]

4

1 に答える 1

7

これはすべて 1 つのすばらしいステップで実行できます。

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

たとえば、4 x 4 のボード上にこのシンボル表現があるとします。

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 に答える