我有一个2D容器,其样本数据如下:
NULL 1
NULL 2
3 NULL
NULL 4
5 NULL
我想向上折叠,消除途中的所有NULL条目,结果是:
3 1
5 2
NULL 4
这可以通过功能性方式完成吗?例如。我可以考虑使用foldLeft
来构造一个新容器并手动添加每一行,但是当我添加行时,它仍然需要使用for循环来查找下一个空白点。有什么办法做到这一点?
答案 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,如果找不到元素,则为空;如果找到匹配项,则为一个元素列表。