您可以尝试使用折叠,简单(易于理解)的方法是向左折叠:
(Array.empty[String] /: arr) {
case (prev, "") => prev :+ prev.lastOption.getOrElse("");
case (prev, l) => prev :+ l
}
> res01: Array[String] = Array(a, a, a, b, c, c)
这通过附加之前的内容构建了一个新数组arr
元素或结果列表的最后一个,具体取决于源元素是否为空字符串。
您也可以将其写为:
(Array.empty[String] /: arr) {
case (Array(), l) => Array(l)
case (prev, "") => prev :+ prev.last;
case (prev, l) => prev :+ l
}
可以通过使用列表和前置来优化它:
{(List.empty[String] /: arr) {
case (Nil, l) => l::Nil
case (h::tail, "") => h::h::tail;
case (prev, l) => l::prev
} reverse } toArray
如果您不喜欢左折叠和右折叠方法的符号版本。这里有它的文本标识符:
arr.foldLeft(Array.empty[String]) {
case (prev, "") => prev :+ prev.lastOption.getOrElse("");
case (prev, l) => prev :+ l
}
arr.foldLeft(List.empty[String]) {
case (Nil, l) => l::Nil
case (h::tail, "") => h::h::tail;
case (prev, l) => l::prev
}.reverse toArray
它的方法和实现完全相同,但名称不同。