Так как значение Int
не может быть null
, и в этом контексте внутренний тип массива будет иметь тип Array[Any]
(не очень полезно), вместо этого я собираюсь использовать String
, что можетbe 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))