はじめに
元の文章を形態素解析した結果Listを、記号などの特定条件に合致した箇所で分割したかった。
以前にfoldRightの便利さに感動したので、foldでなんとかならんか試してみました。
結論
やはりfoldは便利!
アセンブラ、C、C++、Javaでアラフィフまで過ごしたおじさんには関数型、Listの概念が超新鮮でほんとに楽しい。C++でオブジェクト指向やジェネリクスに触れて以来の感動を味わっています。
まだまだ全然わかっていないので、もっと色々試してみたい。
処理
こんな感じになりました。
// 入力。例えば数値文字位置で分割したい。
val input = List("a", "1", "b", "B", "2", "c", "3")
// 分割
val result = input.foldLeft(mutable.ListBuffer.empty[mutable.ListBuffer[String]]) { (current, x) =>
if (current.isEmpty) current += mutable.ListBuffer.empty[String]
x match {
case "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "0" => current += mutable.ListBuffer.empty[String]
case _ => current.last += x
}
current
}
結果。入力の末尾が区切り条件の場合は、出力の末尾に空白要素が入りますが。
ListBuffer(ListBuffer(a), ListBuffer(b, B), ListBuffer(c), ListBuffer())