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

Java 如何通过消除所有空/空条目来折叠二维数组,java,algorithm,scala,functional-programming,Java,Algorithm,Scala,Functional Programming,我有一个2D容器,其样本数据如下: NULL 1 NULL 2 3 NULL NULL 4 5 NULL 我想向上折叠,去掉所有的空条目,结果如下: 3 1 5 2 NULL 4 这能以功能性的方式完成吗?例如,我可以考虑使用foldLeft构造一个新容器并手动添加每一行,但是当我添加行时,它仍然需要使用for循环来查找下一个空点。有什么办法可以做到这一点吗?您可以为此使用过滤器。 在本例中,我将使用元组,以以下内容结束: val tuplesList

我有一个2D容器,其样本数据如下:

NULL  1
NULL  2
3     NULL
NULL  4
5     NULL
我想向上折叠,去掉所有的空条目,结果如下:

3     1
5     2
NULL  4

这能以功能性的方式完成吗?例如,我可以考虑使用foldLeft构造一个新容器并手动添加每一行,但是当我添加行时,它仍然需要使用for循环来查找下一个空点。有什么办法可以做到这一点吗?

您可以为此使用过滤器。 在本例中,我将使用元组,以以下内容结束:

val tuplesList = List( (null, 1), (null, 2), (3, null), (null, 4), (5, null))

tuplesList.filter(_._1 != null) :: tuplesList.reverse.find(_._1 == null).toList

第一段保留元组的第一个元素不为null的所有元素,而第二部分反转列表,查找键为null的第一个元素,并将其转换为列表,如果未找到元素,则为空;如果找到匹配项,则为单元素列表。

您可以使用筛选器进行此操作。 在本例中,我将使用元组,以以下内容结束:

val tuplesList = List( (null, 1), (null, 2), (3, null), (null, 4), (5, null))

tuplesList.filter(_._1 != null) :: tuplesList.reverse.find(_._1 == null).toList
第一段保留元组的第一个元素不为null的所有元素,而第二段反转列表,查找键为null的第一个元素,并将其转换为列表,如果未找到元素,则为空;如果找到匹配项,则为单元素列表。

因为Int值不能为null,在这个上下文中,它会使内部数组类型array[Any]不是很有用,我将使用String,它可以是null

对于不同长度/宽度的2D阵列,我们可以采用不同的方法。可能更复杂一些,但也更安全,因为它对输入的假设更少。它只需要能够转置所有长度相同的行。即使容器是空的,它也能工作

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))
由于Int值不能为null,并且在这种上下文中,它会使内部数组类型array[Any]不太有用,因此我将使用String,它可以为null

对于不同长度/宽度的2D阵列,我们可以采用不同的方法。可能更复杂一些,但也更安全,因为它对输入的假设更少。它只需要能够转置所有长度相同的行。即使容器是空的,它也能工作

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))
根据jwvh回复中提到的评论,以下是 更多列数:

试验

根据jwvh回复中提到的评论,以下是 更多列数:

试验


这与java有什么关系?@NicholasK,因为它可以由java或任何其他语言实现?这与java有什么关系?@NicholasK,因为它可以由java或任何其他语言实现?TupleList是类型List[any,any],结果是List[Product with Serializable]。很难从中提取有用的数据。tuplesList的类型是List[Any,Any],结果是List[Product with Serializable]。很难从中提取有用的数据。如果列数超过2,该怎么办?@texasbruce;请看我的补充。如果列数超过2,该怎么办?@texasbruce;见我的补充。
scala> collapseUpwards(container1)
res12: Array[Array[String]] = Array(Array(3, 1), Array(5, 2), Array(null, 4))

scala> collapseUpwards(container2)
res13: Array[Array[String]] = Array(Array(3, 1, 7), Array(5, 2, 8), Array(null, 4, 6))