java - 如何通过消除所有空/空条目来折叠二维数组

标签 java algorithm scala functional-programming

我有一个带有示例数据的 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/

相关文章:

scala - 检查范围是否包含 Scala 中的值的通用方法

java - 使用 Java 解析 Facebook signed_request 返回格式错误的 JSON

java - 使用 ItemTouchHelper 与 RecyclerView 中锁定的 ViewHolder 进行交互

java - 获取 "Attribute "ref“必须为元素类型 "property"声明。”

c - 如何找到解析形式未知的函数的根,而该函数可作为一组列表值使用?

php - 如何将 N 个向量的每个元素相乘 N^N 次

php - 以编程方式返回两个 json 文件差异的最佳方法

scala - Lift 中的数据库架构迁移

java - 如何在 weblogic 的访问日志中记录 session ID

scala - 从Scala的 map 中选择第一个 'N'元素