
Java入門|文字列から文字の位置を探す方法
文字の場所が分かるようになると、文字列処理はもっと賢くなる
Javaで文字列を扱っていると、この文字はどこにあるのだろう、この記号は入っているのだろうか、という確認をしたくなる場面がよくあります。たとえば、メールアドレスに @ が入っているかを調べたいときや、文章の中に特定の文字が含まれているかを知りたいときです。こうした処理は、入力チェックや検索機能の基本としてとても大切です。
そんなときに活躍するのが、Stringクラスの indexOf() メソッドです。indexOf() を使うと、指定した文字や文字列がどこに現れるかを調べることができます。見つかったときはその位置が返され、見つからなかったときは特別な値が返されます。このしくみを理解すると、文字列の中身をただ表示するだけでなく、条件に応じて調べたり判断したりできるようになります。
ここでは、文字列の中から文字の位置を探す方法について、やさしく整理しながら見ていきます。あわせて、見つからなかった場合の扱い方や、位置を0から数えるという大切な考え方についても、しっかり確認していきましょう。
文字の位置を探すとはどういうことか
文字列は、文字が順番に並んだデータです。たとえば、さくらもち という文字列があったとします。この中に も という文字が入っているかを調べたい場合、ただ目で見るだけならすぐに分かりますが、プログラムではその位置を自分で探す必要があります。
そこで役立つのが indexOf() です。このメソッドは、指定した文字や文字列を探して、最初に見つかった位置を返してくれます。
たとえば、さくらもち の中で も を探すと、位置として 3 が返ります。Javaでは先頭の文字を 0 として数えるためです。
| 位置 | 文字 |
|---|---|
| 0 | さ |
| 1 | く |
| 2 | ら |
| 3 | も |
| 4 | ち |
このように、文字列検索は「その文字があるかどうか」だけでなく、「どこにあるか」を知るための処理でもあります。
indexOf() メソッドの役割
indexOf() メソッドは、指定した文字や文字列を検索し、最初に見つかった位置を返すメソッドです。
基本的な形は次のようになります。
文字列変数.indexOf(探したい文字)または
文字列変数.indexOf(探したい文字列)戻り値は int 型です。つまり、見つかった位置を整数で受け取ります。
このメソッドの大事な特徴は次の2つです。
| 特徴 | 内容 |
|---|---|
| 見つかった場合 | 最初に現れた位置を返す |
| 見つからなかった場合 | -1 を返す |
この -1 の意味をしっかり理解しておくと、検索結果に応じた条件分岐を書けるようになります。
シンプルなプログラムで見てみよう
ファイル名:Sample3.java
import java.io.*;
class Sample3
{
public static void main(String[] args) throws IOException
{
// キーボード入力の準備をする
BufferedReader br =
new BufferedReader(new InputStreamReader(System.in));
// 検索される文字列を入力してもらう
System.out.println("言葉を入力してください。");
String str1 = br.readLine();
// 探したい文字を入力してもらう
System.out.println("探したい1文字を入力してください。");
String str2 = br.readLine();
// 入力された先頭の1文字を取り出す
char ch = str2.charAt(0);
// 文字の位置を検索する
int num = str1.indexOf(ch);
// 結果を表示する
if (num != -1)
System.out.println(str1 + "の" + (num + 1) + "文字目に「" + ch + "」が見つかりました。");
else
System.out.println(str1 + "の中に「" + ch + "」は見つかりませんでした。");
}
}このプログラムでは、まず検索される文字列を入力し、そのあとで探したい1文字を入力しています。そして、indexOf() を使ってその文字の位置を調べています。
たとえば、次のように入力したとします。
言葉を入力してください。
たんぽぽ
探したい1文字を入力してください。
ぽ
このときの表示結果は次のようになります。
たんぽぽの4文字目に「ぽ」が見つかりました。プログラムの流れを順番に整理しよう
このプログラムがどんな順番で動いているかを整理すると、かなり分かりやすくなります。
| 順番 | 処理内容 | 説明 |
|---|---|---|
| 1 | BufferedReader を作成する | キーボード入力の準備をする |
| 2 | str1 に文字列を入力する | 検索される対象を受け取る |
| 3 | str2 に文字を入力する | 探したい内容を受け取る |
| 4 | str2.charAt(0) | 入力された最初の1文字を取り出す |
| 5 | str1.indexOf(ch) | 文字列の中から文字を探す |
| 6 | if 文で判定する | 見つかったかどうかで表示を分ける |
この流れを見ると、indexOf() だけでなく、これまで学んだ charAt() や if 文も組み合わさっていることが分かります。文字列処理は、1つのメソッドだけで完結するより、いくつかの基本を組み合わせて使うことが多いです。
indexOf() は最初に見つかった位置を返す
indexOf() の重要なポイントは、最初に見つかった位置を返すということです。
たとえば、文字列 こころここにあり の中で こ を探す場合を考えてみましょう。
| 位置 | 文字 |
|---|---|
| 0 | こ |
| 1 | こ |
| 2 | ろ |
| 3 | こ |
| 4 | こ |
| 5 | に |
| 6 | あ |
| 7 | り |
この文字列には こ が何回も出てきますが、indexOf('こ') の結果は 0 になります。なぜなら、一番最初に見つかった こ の位置を返すからです。
つまり、indexOf() は「最初の一致」を探すメソッドだと覚えておくとよいです。
見つからないときは -1 が返る
indexOf() はとても便利ですが、検索した文字が見つからないこともあります。そのときには -1 が返されます。
たとえば、すいか という文字列の中で め を探しても、その文字は入っていません。この場合、indexOf('め') の結果は -1 です。
このしくみがあるので、プログラムでは次のような判断ができます。
| indexOf() の結果 | 意味 |
|---|---|
| 0以上 | 見つかった |
| -1 | 見つからなかった |
このルールを使えば、if 文で分岐できます。
if (num != -1)この条件は、見つかったときの処理を行うためのものです。反対に、-1 のときは見つからなかったとして別のメッセージを表示できます。
なぜ num + 1 として表示しているのか
プログラムの中では、表示部分で num + 1 を使っていました。
System.out.println(str1 + "の" + (num + 1) + "文字目に「" + ch + "」が見つかりました。");これは、Javaの位置が 0 から始まるためです。
たとえば、たんぽぽ の中で ぽ が見つかった位置は 3 ですが、人が普段読むときには 4文字目 と言ったほうが自然です。
この違いを整理すると、次のようになります。
| Javaでの位置 | 人がふつうに数える位置 |
|---|---|
| 0 | 1文字目 |
| 1 | 2文字目 |
| 2 | 3文字目 |
| 3 | 4文字目 |
つまり、プログラム内部では 0 から数え、表示では 1 から数えるように調整しているわけです。
charAt() と組み合わせている理由
このプログラムでは、検索する文字をそのまま indexOf() に渡すのではなく、いったん charAt(0) を使っています。
String str2 = br.readLine();
char ch = str2.charAt(0);これは、キーボードからの入力が文字列として受け取られるからです。たとえ1文字だけ入力しても、readLine() の結果は String 型になります。
そのため、先頭の1文字を取り出して char 型に変え、それを indexOf() に渡しています。
この流れはとても自然で、これまで学んだ Stringクラスのメソッドがつながって使われている良い例です。
indexOf() のイメージを図でつかもう

この図は、文字列 たんぽぽ の中から ぽ を探している様子を表しています。中央にある文字列には位置番号がついていて、Javaでは先頭を 0 として数えることが分かるようになっています。検索文字の ぽ が、文字列の中の該当する文字に向かって示されており、その結果として indexOf(ぽ) が 3 を返す流れが見えるようになっています。
この図を見ると、indexOf() が文字そのものを返すのではなく、位置を返していることが理解しやすくなります。また、人が数える 4文字目 と、Javaの位置 3 の違いにも気づきやすくなります。
indexOf() を使うとどんな場面で便利なのか
indexOf() は学習用の例だけでなく、実際のプログラムでもかなり役立ちます。
たとえば、次のような場面があります。
| 場面 | 使い方のイメージ |
|---|---|
| メールアドレスの確認 | @ が含まれているかを調べる |
| ファイル名の確認 | . がどこにあるかを探す |
| 文章の検索 | 特定の語句が含まれているかを調べる |
| 区切り位置の発見 | ハイフンやスラッシュの位置を見つける |
このように、indexOf() は単なる練習用メソッドではなく、文字列処理の基本としてさまざまな場面に応用できます。
文字だけでなく文字列も検索できる
今回の例では1文字を検索していますが、indexOf() は文字列そのものを検索することもできます。
たとえば、次のような使い方です。
String text = "東京タワー";
int num = text.indexOf("タワ");この場合、タワ が始まる位置が返されます。
このように、indexOf() は char だけでなく String も引数に取れるので、1文字検索にも部分文字列検索にも使える便利なメソッドです。
整理すると、次のようになります。
| 書き方 | 検索対象 |
|---|---|
| indexOf(char) | 1文字を探す |
| indexOf(String) | 文字列を探す |
よくある注意点
indexOf() を使うときには、いくつか気をつけたい点があります。
| 注意点 | 内容 |
|---|---|
| 位置は 0 から始まる | 1文字目は 0 |
| 見つからないと -1 | 0 ではないので注意する |
| 最初に見つかった位置を返す | 2回目以降ではない |
| 入力は文字列として受け取られる | 1文字だけ取り出すなら charAt(0) が必要なことがある |
特に、見つからなかったときの値が -1 という点はとても大切です。ここを 0 と勘違いすると、先頭にある文字と区別できなくなってしまいます。
今後の文字列処理につながる大事な一歩
indexOf() を理解すると、文字列の中をただ見るだけでなく、条件に応じて調べる処理ができるようになります。これは、この先に学ぶ substring() や startsWith()、endsWith() などのメソッドともつながる大切な考え方です。
たとえば、ある記号の位置を indexOf() で探して、その位置をもとに substring() で前半と後半を切り分ける、といった処理にも発展できます。つまり、位置を調べるという操作は、より複雑な文字列処理の土台になるのです。
Stringクラスの indexOf() メソッドは、指定した文字や文字列がどこにあるかを調べる、とても基本的で使い道の広いメソッドです。文字列の位置を返すという考え方と、見つからないときは -1 が返るというルールをしっかり押さえておくと、文字列を使ったプログラムがぐっと書きやすくなります。
