给定一个可能很大的图像(或二维数字数组),我想遍历所有像素(或数字),例如计算所有黑色的(或 0 个值)。
我知道我可以简单地使用 for comprehension like
for (y <- 0 until img.height; x <- 0 until img.width) {
...
}
但是我需要一个可变变量来进行计数。这可能不是真正的问题,但假设我不想要这个并且想使用更实用的样式,我该怎么做而不创建具有宽度 x 高度元素的大型数据结构(换句话说保持内存 - 0 unt img.height
和 0 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/