gpt4 book ai didi

Scala 最佳实践 : mapping 2D data

转载 作者:行者123 更新时间:2023-12-02 07:38:22 24 4
gpt4 key购买 nike

在 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 会产生 Iterable[Item]。如果我是对的,唯一缺少的一 block 拼图是以某种方式在 2D 范围上执行 map 操作。

最佳答案

您可以一步完成所有这些:

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)

我想这就是你想要的。

关于Scala 最佳实践 : mapping 2D data,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13865344/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com