Scala:折叠二维数组

标签 scala functional-programming

给定一个可能很大的图像(或二维数字数组),我想遍历所有像素(或数字),例如计算所有黑色的(或 0 个值)。

我知道我可以简单地使用 for comprehension like

for (y <- 0 until img.height; x <- 0 until img.width) {
    ...
}

但是我需要一个可变变量来进行计数。这可能不是真正的问题,但假设我不想要这个并且想使用更实用的样式,我该怎么做而不创建具有宽度 x 高度元素的大型数据结构(换句话说保持内存 - 0 unt img.height0 until img.width 范围的效率)?

最佳答案

映射集合,将内部的转换为子计数,然后对它们求和:

scala> val m = Array(
         Array("B","B","W"),
         Array("W","W","B"),
         Array("W","W","W")
       )
m: Array[Array[String]] = Array(Array(B, B, W), Array(W, W, B), Array(W, W, W))

scala> m.map(_.count(_ == "B")).sum
res0: Int = 3

编辑

您可以使用

创建一个Stream
Stream.tabulate(img.height, img.width)(identity)

然后使用

stream.count(isBlack)

请注意 Stream.tabulate最多接受 5 个维度(作为其第一个参数)。

关于Scala:折叠二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28584852/

相关文章:

haskell - 将 min 命令映射到 haskell 中的多级列表

scala - 如何使用 Mockito 在 Scala 对象中模拟函数?

scala - 仅使用 IO monad 中的值,无需先行 IO 操作

scala - 转发集合的最佳实践

scala - 如何同时使用cookie和BASIC认证?

list - 打印列表中最大数字的长度时出现 SML 错误

functional-programming - - Clojure - 当我运行这个斐波那契函数时出现错误,知道哪里出了问题吗?

Scala maven 插件不编译 StackOverflowError

algorithm - 功能性 "All except one"

javascript - 不可变 JS - 从列表创建 OrderedMap