我有一个带有示例数据的 2D 容器,如下所示:
NULL 1
NULL 2
3 NULL
NULL 4
5 NULL
我想向上折叠 去除途中的所有 NULL 条目,结果如下:
3 1
5 2
NULL 4
这可以用功能性的方式完成吗?例如。我可以想到使用 foldLeft
构建一个新容器并手动添加每一行,但是当我添加行时,它仍然需要使用 for 循环来找到下一个空位。有什么办法可以实现吗?
最佳答案
由于 Int
值不能为 null
,在这种情况下,它会使内部数组类型为 Array[Any]
(不是很有用),我将改用 String
,它可以是 null
。
val container :Array[Array[String]] = Array(Array(null, "1")
,Array(null, "2")
,Array("3", null)
,Array(null, "4")
,Array("5", null))
val as = container.flatMap(s => Option(s(0)))
val bs = container.flatMap(s => Option(s(1)))
val res = as.zipAll(bs, null, null).map(t => Array(t._1, t._2))
//res: Array[Array[String]] = Array(Array(3, 1), Array(5, 2), Array(null, 4))
对于各种长度/宽度的二维数组,我们可以采用不同的方法。可能有点复杂但也更安全,因为它对输入的假设更少。它必须是可转置的(所有行的长度相同)。即使 container
为空,它也能正常工作。
val container :Array[Array[String]] = Array(Array(null, "1", "6")
,Array(null, "2", null)
,Array("3", null, "7")
,Array(null, "4", "8")
,Array("5", null, "9"))
val collapsed = container.transpose.map(_.flatMap(Option(_)))
val maxLen = collapsed.foldLeft(0)(_ max _.length)
val res = collapsed.map(_.padTo(maxLen,null)).transpose
//res: Array[Array[String]] = Array(Array(3, 1, 6)
// ,Array(5, 2, 7)
// ,Array(null, 4, 8)
// ,Array(null, null, 9))
关于java - 如何通过消除所有空/空条目来折叠二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52671190/