我是函数式编程的新手,所以我正在做一些练习。我想写一个函数,给定一个独特的自然矩阵,比如说 5x5,返回一个较小尺寸的独特矩阵的集合,比如说 3x3,其中矩阵必须是完整的,即从原始中相邻的值创建。
01 02 03 04 05
06 07 08 09 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
简单的。只需 3 个一组一个接一个地滑过,然后向下滑动,得到如下所示的东西:
01 02 03 | 02 03 04 | 03 04 05 | 06 07 08
06 07 08 | 07 08 09 | 08 09 10 | 11 12 13
11 12 13 | 12 13 14 | 13 14 15 | 16 17 18
或者,在 Scala 中,
List(List(1, 2, 3), List(6, 7, 8), List(11, 12, 13))
List(List(2, 3, 4), List(7, 8, 9), List(12, 13, 14))
List(List(3, 4, 5), List(8, 9, 10), List(13, 14, 15))
List(List(6, 7, 8), List(11, 12, 13), List(16, 17, 18))
等等等等...
所以我尝试使用 Scala(我选择的语言,因为它允许我从命令式发展到函数式,而且我在过去的几年里一直在使用 Java。
val array2D = "01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25".grouped(3).map(_.trim.toInt).grouped(5)
val sliced = array2D.map(row => row.sliding(3, 1).toList).sliding(3, 1).toList
现在我有一个可以使用的数据结构,但我没有看到一种功能性的方式。当然,我可以遍历每一块sliced
,创建一个var matrix = new ListBuffer[Seq[Int]]()
并强制创建一个包,然后我就完成了。
我想找到一种使用 Scala 的功能性、理想的无点方法,但我很难过。必须有一种方法可以使用 3 或类似的东西进行压缩……我搜索了 ScalaDocs,但似乎无法弄清楚。