为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

呼唤远方 2021-10-28 16:35:21
我有一个带有示例数据的 2D 容器,如下所示:NULL  1NULL  23     NULLNULL  45     NULL我想向上折叠摆脱途中的所有 NULL 条目,结果如下:3     15     2NULL  4这可以以功能方式完成吗?例如,我可以考虑使用foldLeft构造一个新容器并手动添加每一行,但是当我添加行时,它仍然需要使用 for 循环来查找下一个空位。有什么方法可以实现这一目标吗?
查看完整描述

3 回答

?
慕标琳琳

TA贡献1830条经验 获得超9个赞

由于一个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))


查看完整回答
反对 回复 2021-10-28
?
holdtom

TA贡献1805条经验 获得超10个赞

根据回答中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))


查看完整回答
反对 回复 2021-10-28
?
眼眸繁星

TA贡献1873条经验 获得超9个赞

您可以为此使用过滤器。为了这个例子,我将使用元组,以结束以下内容:


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


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

第一段保留元组第一个元素不为空的所有元素,第二段将列表反转,找到“key”为空的第一个元素,并转换为List,如果没有则为空如果找到匹配项,则找到元素或单元素列表。


查看完整回答
反对 回复 2021-10-28
  • 3 回答
  • 0 关注
  • 155 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信