テキスト行のリストがあり、'\' で終わるすべての行を次の行に続くものとして扱いたい、つまりマージしたい。map
以下の再帰コードはそれを行いますが、 , filter
and all?のような巧妙な方法があるに違いありません。
reduceLeft
近いですが、変更された(そして潜在的に短い)新しいリストではなく、単一の結果しか生成しません。
また、以下のコードをよりスリムにするための提案も歓迎します。
object TestX extends App {
// Merge lines together if the former ends with '\'.
//
private def mergeLines( list: List[String] ): List[String] = {
def merge( head: String, tail: List[String] ): List[String] = {
if (head.endsWith("\\")) {
val head2= head.dropRight(1)
if (tail.isEmpty) {
head2 :: Nil // or throw an exception on bad input
} else {
merge( head2 + tail.head, tail.tail )
}
} else {
if (tail.isEmpty)
head :: Nil
else
head :: merge( tail.head, tail.tail ) // note: cannot tailrec this
}
}
if (list.isEmpty) {
list
} else {
merge( list.head, list.tail )
}
}
val list = "These two \\" :: "should be joined" :: "but not this." :: Nil
val list2 = mergeLines(list) // any standard easy way to do this? 'list.mergeIf( _.endsWith('\\') )'
println( list2 )
assert( list2.size == 2 )
}