首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala最佳实践:映射2D数据

Scala最佳实践:映射2D数据
EN

Stack Overflow用户
提问于 2012-12-14 01:36:27
回答 1查看 555关注 0票数 2

在Scala中,以适当的函数方式在Java中执行以下代码的最佳方式是什么?

代码语言:javascript
复制
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:

代码语言:javascript
复制
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)
    }
}

但我想以适当的、函数式的方式来做。

我假设在某种2D范围内应该有map操作。理想情况下,map将执行一个函数,该函数将xy作为输入参数并输出Option[Item]。在那之后,我会得到像Iterable[Option[Item]]flatten这样的东西,它会产生Iterable[Item]。如果我是对的,那么拼图中唯一缺少的部分就是以某种方式在2D范围上执行映射操作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-14 01:53:12

您可以在一个很好的步骤中完成所有这些操作:

代码语言:javascript
复制
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

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

代码语言:javascript
复制
val tileMap = Map(
  (0, 0) -> 'a,
  (1, 0) -> 'b,
  (3, 2) -> 'c
)

我们只需要写:

代码语言:javascript
复制
scala> items(4, 4)(tileMap.get)
res0: IndexedSeq[Symbol] = Vector('a, 'b, 'c)

我想这就是你想要的。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13865344

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档