[AD] Scalaアプリケーションの開発・保守は合同会社ミルクソフトにお任せください
「文字列の先頭の文字を取得したい」「末尾n文字を切り落としたい」なんてことありますよね。
しかし「どのように処理すればいいかな、、、」と迷っている人がほとんどだと思います。
この記事では、部分文字列を取得するためにあらかじめ用意されている、Scalaのたくさんの便利メソッドをご紹介します。
10種のメソッドを理解する
文字列の先頭や末尾の文字を処理するメソッドは、全部で10種類あります。
- 先頭から / 末尾から
- 1文字を / n文字を
- 取得する / 除去する
という、2パターン × 2パターン × 2パターン で8種類あります。
また、特殊な場合に先頭or末尾の1文字を取得するメソッドとして2種類あり、これらを合わせて10種類です。
早速ですが、早見表を掲載します。
あれこれと文字で説明すると逆に分かりづらいかもしれないのですが、表を見れば手っ取り早く全体像を捉えることができるでしょう。
| 〜を取得する | 〜以外を取得する | |
|---|---|---|
| 先頭1文字 | head / headOption | tail |
| 末尾1文字 | last / lastOption | init |
| 先頭n文字 | take(n) | drop(n) |
| 末尾n文字 | takeRight(n) | dropRight(n) |
◯◯を〜〜するには「 」メソッド、という具合に読んでください。
メソッドを覚える順番
もちろんいろいろな覚え方があるので、自分に合った方法で覚えていただければよいかと思いますが、
ここでは参考として、各メソッドを覚える順番を提案してみます。
最初に覚えるメソッド
まずはheadメソッドを覚えましょう。
文字列の先頭1文字を取得する、基本となるメソッドです。
headOptionは、文字列が空文字である可能性がある場合に使用するメソッドです。
次に覚えるメソッド
次に覚えるべきはtailメソッドです。
headメソッドで取得したあとの「残り」「それ以外」の部分です。
そのあと
その次はlast / initを覚えましょう。
この2つは、head / tailを逆転させて、末尾から数えるようにしたものです。
lastOptionは、文字列が空文字である可能性がある場合に使用するメソッドです。
そしてこんどは、take / dropを覚えましょう。
この二つはhead / tailが「1文字」に限定しているのを、どんな文字数でも扱えるよう一般化したものです。
最後に覚えるのがtakeRight / dropRightです。
この二つは、take/dropを逆転させて、末尾から数えるようにしたものです。
あるいは、last / dropを一般化したものと考えることもできます。
10種のメソッドの使い方
先頭1文字
それでは、8種類のメソッドについてそれぞれご紹介していきます。
例として以下の文字列を使用します。
val title = "Scala逆引き解説|Scalapedia"
まずは先頭の1文字を処理するメソッドを見ていきましょう。
先頭の1文字を基準に、それを取得したり切り落としたりするには、headあるいはtailメソッドを使用します。
文字列の先頭1文字を取得するには「headメソッド」
headメソッドを使用すると、文字列の先頭の1文字を取得することができます。
それでは、先頭の1文字を取得して標準出力に出力してみましょう。
println(title.head)
以下のように先頭の1文字だけが表示されます。
S
空文字かもしれない場合には「headOptionメソッド」
headメソッドを使用する際には、文字列の長さに注意する必要があります。
空文字である文字列に対してheadメソッドを使用した場合には、java.lang.NoSuchElementExceptionを投げます。
println("".head)
java.util.NoSuchElementException: head of empty String
例外発生を防ぎ0文字の場合に対応するためには、headOptionメソッドを使用します。
println(title.headOption) println("".headOption)
Some(S) None
文字列の先頭1文字を除去するには「tailメソッド」
tailメソッドを使用すると、文字列の先頭の1文字を切り落とすことができます。
他にも以下のようにさまざまな言い方をすることができます。
- 先頭1文字を除去した文字列を取得する
- 先頭1文字以外の文字列を取得する
- 2文字目以降の文字列を取得する
それでは、2文字目以降の部分を取得して標準出力に出力してみましょう。
val title = "Scala逆引き解説|Scalapedia"
println(title.tail)
これを実行すると、以下のように2文字目以降の部分だけが表示されます。
cala逆引き解説|Scalapedia
空文字かもしれない文字列にtailを実行する場合には例外処理が必要
Scala 2.13.16以降およびScala 3.3.6以降では、文字列が空文字である場合にtailメソッドを実行するとjava.lang.UnsupportedOperationExceptionが投げられます。
println("".tail)
java.lang.UnsupportedOperationException: tail of empty String
headメソッドには空文字がありうる場合の回避策としてheadOptionが用意されていましたが、tailメソッドには空文字の場合の回避策がありません。
したがって、自前で回避策をとる必要があります。
手っ取り早く処理するには、util.Tryで括ってtoOptionメソッドを使用する方法があります。
import scala.util.Try val tailOption = Try("".tail).toOption println(tailOption)
None
末尾1文字
末尾の1文字を基準に、それを取得したり切り落としたりするには、lastあるいはinitメソッドを使用します。
文字列の末尾を取得するには「lastメソッド」
lastメソッドを使用すると、文字列の末尾の1文字を取得することができます。
それでは、末尾の1文字を取得して標準出力に出力してみましょう。
val title = "Scala逆引き解説|Scalapedia"
println(title.last)
以下のように末尾の1文字だけが表示されます。
a
空文字かもしれない場合には「lastOptionメソッド」
headメソッドと同様に、空文字である文字列に対してlastメソッドを使用した場合には、java.lang.NoSuchElementExceptionを投げます。
println("".last)
java.util.NoSuchElementException: last of empty String
例外発生を防ぎ0文字の場合に対応するためには、lastOptionメソッドを使用します。
println(title.lastOption) println("".lastOption)
Some(a) None
文字列の末尾1文字を切り落とすには「initメソッド」
initメソッドを使用すると、文字列の末尾の1文字を切り落とすことができます。
tailメソッドと同様に、以下のような言い方をすることができます。
- 末尾1文字を除去した文字列を取得する
- 末尾1文字以外の文字列を取得する
- 末尾から2文字目以降の文字列を取得する
それでは、末尾1文字以外の部分文字列を取得して標準出力に出力してみましょう。
val title = "Scala逆引き解説|Scalapedia"
println(title.init)
これを実行すると、以下のように2文字目以降の部分だけが表示されます。
Scala逆引き解説|Scalapedi
空文字かもしれない文字列にinitを実行する場合には例外処理が必要
Scala 2.13.16以降およびScala 3.3.6以降では、文字列が空文字である場合にinitメソッドを実行するとjava.lang.UnsupportedOperationExceptionが投げられます。
println("".init)
java.lang.UnsupportedOperationException: init of empty String
headメソッドには空文字がありうる場合の回避策としてheadOptionが用意されていましたが、initメソッドには空文字の場合の回避策がありません。
したがって、自前で回避策をとる必要があります。
手っ取り早く処理するには、util.Tryで括ってtoOptionメソッドを使用する方法があります。
val initOption = util.Try("".init).toOption println(initOption)
None
この動作変更は、他のコレクション型(List、Vectorなど)との一貫性を保つために行われました。
先頭n文字
先頭のn文字を基準に、それを取得したり切り落としたりするには、takeあるいはdropメソッドを使用します。
文字列の先頭n文字を取得するには「takeメソッド」
takeメソッドを使用すると、文字列の先頭のn文字を取得することができます。
それでは、先頭のn文字を取得して標準出力に出力してみましょう。
val title = "Scala逆引き解説|Scalapedia"
println(title.take(11))
以下のように先頭のn文字が表示されます。
Scala逆引き解説|
takeメソッドの場合は、headメソッドと異なり、文字列が空文字でも例外を返すことはありません。
println("".take(11))
文字列の先頭n文字を切り落とすには「dropメソッド」
dropメソッドを使用すると、文字列の先頭のn文字を切り落とすことができます。
それでは、先頭のn文字以外の部分を取得して標準出力に出力してみましょう。
val title = "Scala逆引き解説|Scalapedia"
println(title.drop(11))
これを実行すると、以下のように先頭のn文字を除いた部分だけが表示されます。
Scalapedia
dropメソッドは、文字列が空文字でも例外を返すことはありません。
println("".drop(11))
末尾n文字
末尾のn文字を基準に、それを取得したり切り落としたりするには、takeRightあるいはdropRightメソッドを使用します。
文字列の末尾n文字を取得するには「takeRightメソッド」
takeRightメソッドを使用すると、文字列の末尾のn文字を取得することができます。
それでは、末尾のn文字を取得して標準出力に出力してみましょう。
val title = "Scala逆引き解説|Scalapedia"
println(title.takeRight(11))
以下のように末尾のn文字だけが表示されます。
|Scalapedia
takeRightメソッドは、takeメソッドと同様に、文字列が空文字でも例外を返すことはありません。
println("".takeRight(11))
文字列の末尾n文字を切り落とすには「dropRightメソッド」
dropRightメソッドを使用すると、文字列の末尾のn文字を切り落とすことができます。
それでは、末尾のn文字以外の部分を取得して標準出力に出力してみましょう。
val title = "Scala逆引き解説|Scalapedia"
println(title.dropRight(11))
これを実行すると、以下のように末尾のn文字を除いた部分だけが表示されます。
Scala逆引き解説
dropRightメソッドは、文字列が空文字でも例外を返すことはありません。
println("".dropRight(11))