2016年04月16日

Scalaでfoo:1.0のような文字列を分割してtupleに

下記のような文字列があったとする。

"foo:1.0"

これを foo(String)と1.0(Double)に分けたかった。

とりあえず普通にsplitしてみる。

val arr = "foo:1.0".split(":")
x = arr(0)
y = arr(1).toDouble

まあ、これでもいいけど、なんとなくこの手の処理は1行で書きたい。

splitした後にパターンマッチでtupleにしてみる。

val (x, y) = "foo:1.0".split(":") match { case Array(x, y) => (x, y.toDouble) }

うん、ちょっとスッキリした。

splitでなくspanを使ってみる。spanは指定した文字が出るまでをtupleの1つ目の要素に、指定文字が出現した意向を2つ目めの要素に入れる的な動きができる。

val (x, y) = "foo:1.0".span(_ != ':') match { case (x, y) => (x, y.tail.toDouble) }

splitAtを使っても良いのか。

val str = "foo:1.0"
val (x, y) = str.splitAt(str.indexOf(':')) match { case (x, y) => (x, y.tail.toDouble) }

書き方によって不正な文字が入った場合のエラーの出る位置とかが変わるし、指定文字が複数あった場合の挙動も変わる。必要な例外処理に合った書き方を選びたい。