如何通过消除所有空/空条目来折叠2D数组

时间:2018-10-05 18:13:36

标签: 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循环来查找下一个空白点。有什么办法做到这一点?

3 个答案:

答案 0 :(得分:3)

由于Int的值不能为null,并且在这种情况下,它将使内部数组类型为Array[Any](不是很有用),因此我将使用{改为{1}},可以是String

null

对于各种长度/宽度的2D数组,我们可以采用不同的方法。也许稍微复杂一点,但也更安全,因为它对输入的假设更少。它只是必须是可转置的(所有行的长度相同)。如果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

答案 1 :(得分:1)

  

根据comment答案中提到的jwvh's,以下是该版本   更多列数:

val container1 :Array[Array[String]] = Array(Array(null, "1")
                                           ,Array(null, "2")
                                           ,Array("3", null)
                                           ,Array(null, "4")
                                           ,Array("5", null))

val container2 :Array[Array[String]] = Array(Array(null, "1","7")
                                              ,Array(null, "2",null)
                                              ,Array("3", null,"8")
                                              ,Array(null, "4",null)
                                              ,Array("5", null,"6"))


 def collapseUpwards(con: Array[Array[String]]) = {
   val noNullArrays = con.map(s =>s.zipWithIndex.
                      map(s1=>Option( s(s1._2)))).transpose.map(_.flatten)
   val maxArraySize = noNullArrays.map(_.size).max
   noNullArrays.map(x=>x++Array.fill(maxArraySize-x.size)(null)).transpose
 }

测试

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))

答案 2 :(得分:0)

您可以为此使用过滤器。 为了便于说明,我将使用元组,以以下内容结尾:

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的第一个元素,并将其转换为List,如果找不到元素,则为空;如果找到匹配项,则为一个元素列表。