0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Listを分割してList[List]に(foldLeft)

Posted at

はじめに

元の文章を形態素解析した結果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())
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?