Javaでよく出てくるメソッドにindexOfとlastIndexOfがある。いろいろなクラスで用意されていて、イメージ的には検索をしたいときに使うものだ。
このページでは様々な場面で活躍するindexOfメソッドについてお伝えする。主要なクラスのほとんどでサンプルコードも用意してみた。参考にして欲しい。
目次
JavaのindexOf / lastIndexOfの使い方
Indexとは索引のことだ。本の終わりには、索引がある。索引は、言葉とその言葉が使われているページの一覧である。Javaのクラスが持つindexOfメソッドやlastIndexOfメソッドは、この索引のように言葉を引数として渡すと、ページに当たる位置を戻してくる。
次のクラスは文字や文字列の位置を扱うindexOfメソッドやlastIndexOfメソッドを持っている。探したい文字や文字列を引数として渡すと、その位置が戻ってくる。
- String
- StringBuffer
- StringBuilder
次のクラスはオブジェクトの配列の位置を扱うindexOfメソッドやlastIndexOfメソッドを持っている。
- ArrayList
- LinkedArray
書き方の基本はどれも同じだ。
最初に出現する位置 = オブジェクト.indexOf(値)
最後に出現する位置 = オブジェクト.lastIndexOf(値)
JavaでのindexOf / lastIndexOfの書き方の詳細を確認していこう。
クラスによる違い
クラスによってメソッドの機能に違いがある。文字を探すのか、文字列を探すのか、先頭から探すのか、末尾から探すのか、その機能の詳細をクラスごとにまとめてみよう。
サンプルプログラムも下の方に用意した。こちらをさっさと確認したいという方は、飛ばしてそちらを見るのがいいだろう。
String - indexOf
文字列の中の文字を検索するためのメソッドindexOfのAPI仕様を紹介する。
indexOf(int ch)
戻り値の型 |
戻り値の型 public int |
内容 |
指定された文字が最初に出現するこの文字列の中のインデックスを戻す。
もしこの文字列オブジェクトによって表された文字順の中に、chの値を持つ文字が出現したならば、最初に出現したインデックス(ユニコード単位の中の)が戻される。 0から0xFFF(すべてのコードを含む)の範囲にあるchの値のために、最小値kは、以下のようなになる; this.charAt(k) == ch はtrueである。その他のchの値のために、最小値kは以下のようになる: this.codePointAt(k) == ch はtrueである。どちらの場合においても、もしこの文字列の中にそのような文字が一つも出現しないならば、-1が戻される。
引数:ch - 一つの文字(ユニコードの文字コード番号)
戻り値:このオブジェクトによって表された文字順で、最初に出現した文字のインデックス、あるいは、もし文字が出現しないならば-1。 |
indexOf(int ch, int fromIndex)
戻り値の型 |
戻り値の型 public int |
内容 |
指定されたインデックスから検索を始めて、指定された文字が最初に出現するこの文字列の中のインデックスを戻す。
もし、fromIndexより小さくないインデックスの位置にある文字列オブジェクトによって表された文字順の中に、chの値を持つ文字が出現したならば、最初に出現したインデックスが戻される。 0から0xFFF(すべてのコードを含む)の範囲にあるchの値のために、最小値kは以下のようになる: (this.charA(k) == ch) && (k >= fromIndex) はtrueである。他のchの値のために、最小値は以下のようになる。 (this.codePointAt(k) == ch) && (k >= fromIndex) はtrueである。もしこの文字列のfromIndex位置、もしくはfromIndexの後のどちらの場合にも、そのような文字が一つも出現しないならば、-1が戻される。 fromIndexの値に対する制限はない。もしそれがマイナスならば、それがゼロであるのと同じ結果になる:この全体の文字列は検索されるかもしれない。もしそれがこの文字列の長さより大きいのであれば、それがこの文字列の長さと同じであるかのような結果となる:-1が戻される。 すべてのインデックスはcharの値(ユニコード単位)で特定される。
引数: ch - 一つの文字(ユニコードの文字コード番号) fromIndex - 検索を始めるためのインデックス
戻り値:fromIndexより大きい、もしくは等しいこのオブジェクトによって表された文字順で、最初に出現した文字のインデックス、あるいは、もし文字が出現しないならば-1。 |
文字列の中の一部分にあたる文字列を検索するためのメソッドindexOfのAPI仕様を紹介する。
indexOf(String str)
戻り値の型 |
戻り値の型 public int |
内容 |
指定された部分文字列が最初に出現するこの文字列の中のインデックスを戻す。 戻されるインデックスは、以下のように表される最小値k: this.startsWith(str, k) もしそのようなkの値が一つも存在しないならば、-1が戻される。
引数:str - 検索するための部分文字列
戻り値:指定された部分文字列が最初に出現するインデックス、あるいは、もしそれが一つも出現しないならば-1。 |
indexOf(String str, int fromIndex))
戻り値の型 |
戻り値の型 public int |
内容 |
指定されたインデックスから検索を始めて、指定された部分文字列が最初に出現するこの文字列の中のインデックスを戻す。 戻されるインデックスは、以下のように表される最小値k: k >= fromIndex && this.startsWith(str , k) もしそのようなkの値が一つも存在しないならば、-1が戻される。
引数: str - 検索するための部分文字列 fromIndex - 検索を始めるためのインデックス
戻り値:指定されたインデックスから始めて、指定された部分文字列が最初に出現するインデックス、あるいは、それが一つも出現しないならば-1。 |
String - lastIndexOf
文字列の中の文字を検索するためのメソッドlastIndexOfのAPI仕様を紹介する。
lastIndexOf (int ch)
戻り値の型 |
戻り値の型 public int |
内容 |
指定された文字が最後に出現するこの文字列の中のインデックスを戻す。 0から0xFFF(すべてのコードを含む)の範囲にあるchの値のために、戻されるインデックス(ユニコード単位の中の)は以下のような最大値kになる: this.charA(k) == ch はtrueである。他のchの値のために、最大値kは以下のようになる。 this.codePointAt(k) == ch はtrueである。 どちらの場合においても、もしこの文字列の中にそのような文字が一つも出現しないならば、-1が戻される。文字列は、最後の文字から始めて逆向きに検索される。
引数:ch - 一つの文字(ユニコードの文字コード番号)
戻り値:このオブジェクトによって表された文字順で、最後に出現した文字のインデックス、あるいは、もし文字が出現しないならば-1。 |
lastIndexOf(int ch, int fromIndex)
戻り値の型 |
戻り値の型 public int |
内容 |
指定されたインデックスから逆に検索を始めて、指定された文字が最後に出現するこの文字列の中のインデックスを戻す。
0から0xFFF(すべてのコードを含む)の範囲にあるchの値のために、戻されるインデックス(ユニコード単位の中の)は以下のような最大値kになる: (this.charA(k) == ch) && (k <= fromIndex) はtrueである。他のchの値のために、最大値kは以下のようになる。 (this.codePointAt(k) == ch) && (k <= fromIndex) はtrueである。もしこの文字列のfromIndex位置、もしくはfromIndexの前のどちらの場合にも、そのような文字が一つも出現しないならば、-1が戻される。 すべてのインデックスはcharの値(ユニコード単位)で特定される。
引数: ch - 一つの文字(ユニコードの文字コード番号) fromIndex - 検索を始めるためのインデックス。fromIndexの値に対する制限はない。もしそれがこの文字列の長さより大きいか、もしくは同じであれば、それがこの文字列の長さより小さいものと同じであるかのような結果となる:この全体の文字列が検索される。もしそれがマイナスであれば、それは-1である時と同じ結果となる:-1が戻される。
戻り値:fromIndexより小さいかもしくは同じであるこのオブジェクトによって表された文字順で、最後に出現した文字のインデックス、あるいは、もし文字がその位置の前にないのであれば-1. |
文字列の中の文字列を検索するためのメソッドlastIndexOfのAPI仕様を紹介する。
lastIndexOf(String str)
戻り値の型 |
戻り値の型 public int |
内容 |
指定された部分文字列が最後に出現するこの文字列の中のインデックスを戻す。空の文字列””の最後の出現は、インデックス値this.length()で起きると考えられている。 戻されるインデックスは、以下のように表される最大値k: this.startsWith(str , k) もしそのようなkの値が一つも存在しないならば、-1が戻される。
引数:str - 検索するための部分文字列
戻り値:指定された部分文字列が最後に出現するインデックス、あるいは、もしそれが一つも出現しないならば-1。 |
lastIndexOf(int ch, int fromIndex)
戻り値の型 |
戻り値の型 public int |
内容 |
指定されたインデックスから逆に検索を始めて、指定された部分文字列が最後に出現するこの文字列の中のインデックスを戻す。 戻されるインデックスは、以下のように表される最大値k: k <= fromIndex && this.startsWith(str , k) もしそのようなkの値が一つも存在しないならば、-1が戻される。
引数: str - 検索するための代わりの文字列 fromIndex - 検索を始めるためのインデックス
戻り値:指定されたインデックスから逆に検索を始めて、指定された部分文字列が最後に出現するインデックス、あるいは、それが一つも出現しないならば-1。 |
StringBuffer - indexOf
文字列の中の文字列を検索するためのメソッドindexOfのAPI仕様を紹介する。
indexOf(String str)
戻り値の型 |
戻り値の型 public int |
内容 |
指定された部分文字列が最初に出現するこの文字列の中のインデックスを戻す。 戻される整数は最小値kで、以下のように表される: this.toString().startsWith(str, <i>k</i>) はtrueである。
引数:str - いずれかの文字列
戻り値:もしこのオブジェクトの中で文字引数が部分文字列として存在するならば、その最初の部分文字列の最初の文字のインデックスが戻される:もしそれが部分文字列として出現しないならば、-1が戻される。
以降:1.4 |
indexOf(String str, int fromIndex))
戻り値の型 |
戻り値の型 public int |
内容 |
指定されたインデックスから始めて、指定された部分文字列が最初に出現するこの文字列の中のインデックスを戻す。戻される整数は最小値kで、以下のように表される: k >= Math.min(fromIndex, this.length()) && this.toString().startsWith(str, k) もしそのようなkの値が一つも存在しないならば、-1が戻される。
引数: str - 検索する部分文字列 fromIndex - 検索を始めるためのインデックス
戻り値:指定されたインデックスから始めて、指定された部分文字列が最初に出現するこの文字列の中のインデックス。
以降:1.4 |
StringBuilder - indexOf
文字列の中の文字列を検索するためのメソッドindexOfのAPI仕様を紹介する。
indexOf(String str)
戻り値の型 |
戻り値の型 public int |
内容 |
指定された部分文字列が最初に出現するこの文字列の中のインデックスを戻す。 戻されるインデックスは最小値kで、以下のように表される。 this.toString().startsWith(str, <i>k</i>) はtrueである。
引数:str - いずれかの文字列
戻り値:もしこのオブジェクトの中で文字引数が部分文字列として存在するならば、その最初の部分文字列の最初の文字のインデックスが戻される:もしそれが部分文字列として出現しないならば、-1が戻される。 |
indexOf(String str, int fromIndex))
戻り値の型 |
戻り値の型 public int |
内容 |
指定されたインデックスから始めて、指定された部分文字列が最初に出現するこの文字列の中のインデックスを戻す。戻される整数は最小値kで、以下のように表される: k >= Math.min(fromIndex, this.length()) &&
this.toString().startsWith(str, k) もしそのようなkの値が一つも存在しないならば、-1が戻される。 引数: str - 検索する部分文字列 fromIndex - 検索を始めるためのインデックス
戻り値:指定されたインデックスから始めて、指定された部分文字列が最初に出現するこの文字列の中のインデックス。 |
ArrayList
このクラスのindexOf()メソッドについての詳細は、他のメソッドと共に別の記事「Java 配列の容量と順序を簡単に扱う(ArrayList)」に載せられている。
LinkedArray
このクラスのindexOf()メソッドについての詳細は、他のメソッドと共に別の記事「Java 待ち行列を簡単に扱う(LinkedList)」に載せられている。
Stringクラスの文字検索のサンプルプログラム
それでは実際にサンプルプログラムを確認してみよう。
このサンプルは、Stringクラスの文字列検索を行うindexOf / lastIndexOfメソッドの機能を示している。文字が見つかった時だけでなく、みつからならかった場合も含んでいる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
public class IndexOfStringByCharacterSearch { public static void main(String[] args) { String text = new String("abcdefabcdef");//[1] int index;//[2] index = text.indexOf('b');//[3] System.out.println("[4] index = " + index); index = text.indexOf('b',0);//[5] System.out.println("[8] index = " + index); index = text.indexOf('b',-2);//[7] System.out.println("[10] index = " + index); index = text.indexOf('?',0);//[9] System.out.println("[12] index = " + index); int lastIndex;//[11] lastIndex = text.lastIndexOf('f');//[12] System.out.println("[13] lastIndex = " + lastIndex); lastIndex = text.lastIndexOf('f',11);//[14] System.out.println("[15] lastIndex = " + lastIndex); lastIndex = text.lastIndexOf('f',-2);//[16] System.out.println("[17] lastIndex = " + lastIndex); lastIndex = text.lastIndexOf('?',11);//[18] System.out.println("[19] lastIndex = " + lastIndex); } } |
実行結果
1 2 3 4 5 6 7 8 |
[4] index = 1 [8] index = 1 [10] index = 1 [12] index = -1 [13] lastIndex = 11 [15] lastIndex = 11 [17] lastIndex = -1 [19] lastIndex = -1 |
サンプルプログラムの説明
それでは簡単にプログラムの解説をしてゆこう。
- [1] Stringクラスのオブジェクトtextを、初期値:"abcdefabcdef"で生成する。
- [2] 変数indexを宣言する。
- [3][4]i indexにindexOf('b')を代入し、表示する。
- [5][6] indexにindexOf('b',0)を代入し、表示する。
- [7][8] indexにindexOf('b',-2)を代入し、表示する。
- [9][10] indexにindexOf('?',0)を代入し、表示する。
- [11 ]変数lastIndexを宣言する。
- [12][13] lastIndex にlastIndexOf('f')を代入し、表示する。
- [14][15] lastIndex にlastIndexOf('f',11)を代入し、表示する。
- [16][17] lastIndex にlastIndexOf('f',-2)を代入し、表示する。
- [18][19] lastIndex にlastIndexOf('?',11)を代入し、表示する。
Stringクラスの文字列検索のサンプルプログラム
このサンプルは、Stringクラスの文字列検索を行うindexOf / lastIndexOfメソッドの機能を示している。文字列が見つかった時だけでなく、みつからならかった場合も含んでいる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
public class IndexOfStringBySubstringSearch { public static void main(String[] args) { String text = "abcdefabcdef";//[1] int index;//[2] index = text.indexOf("bc");//[3] System.out.println("[4] index = " + index); index = text.indexOf("bc",0);//[5] System.out.println("[6] index = " + index); index = text.indexOf("bc",-2);//[7] System.out.println("[8] index = " + index); index = text.indexOf("?!",0);//[9] System.out.println("[10] index = " + index);//[10] int lastIndex;//[11] lastIndex = text.lastIndexOf("ef");//[12] System.out.println("[13] lastIndex = " + lastIndex); lastIndex = text.lastIndexOf("ef",11);//[14] System.out.println("[15] lastIndex = " + lastIndex); lastIndex = text.lastIndexOf("ef",-2);//[16] System.out.println("[17] lastIndex = " + lastIndex); lastIndex = text.lastIndexOf("?!",11);//[18] System.out.println("[19] lastIndex = " + lastIndex); } } |
実行結果
1 2 3 4 5 6 7 8 |
[4] index = 1 [6] index = 1 [8] index = 1 [10] index = -1 [13] lastIndex = 10 [15] lastIndex = 10 [17] lastIndex = -1 [19] lastIndex = -1 |
サンプルプログラムの説明
それでは簡単にプログラムの解説をしてゆこう。
- [1] Stringクラスのオブジェクトtextを、初期値:"abcdefabcdef"で生成する。
- [2] 変数indexを宣言する。
- [3][4]i indexにindexOf("bc")を代入し、表示する。
- [5][6] indexにindexOf("bc",0)を代入し、表示する。
- [7][8] indexにindexOf("bc",-2)を代入し、表示する。
- [9][10] indexにindexOf("?!",0)を代入し、表示する。
- [11]変数lastIndexを宣言する。
- [12][13] lastIndex にlastIndexOf("ef")を代入し、表示する。
- [14] [15] lastIndex にlastIndexOf("ef",11)を代入し、表示する。
- [16][17] lastIndex にlastIndexOf("ef",-2)を代入し、表示する。
- [18][19] lastIndex にlastIndexOf("?!",11)を代入し、表示する。
StringBufferクラスの文字列検索のサンプルプログラム
このサンプルは、StringBufferクラスの文字列検索を行うindexOf / lastIndexOfメソッドの機能を示している。文字列が見つかった時だけでなく、みつからならかった場合も含んでいる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public class IndexOfStringBufferBySubstringSearch { public static void main(String[] args) { StringBuffer buffer = new StringBuffer("abcdefabcdef");//[1] int index;//[2] index = buffer.indexOf("bc");//[3] System.out.println("[4] index = " + index); index = buffer.indexOf("bc",0);//[5] System.out.println("[6] index = " + index); index = buffer.indexOf("bc",-2);//[7] System.out.println("[8]index = " + index); index = buffer.indexOf("?!",0);//[9] System.out.println("[10]index = " + index); } } |
実行結果
1 2 3 4 |
[4] index = 1 [6] index = 1 [8]index = 1 [10]index = -1 |
サンプルプログラムの説明
それでは簡単にプログラムの解説をしてゆこう。
- [1] StringBufferクラスのオブジェクトbufferを、初期値:"abcdefabcdef"で生成する。
- [2] 変数indexを宣言する。
- [3][4] indexにindexOf("bc")を代入し、表示する。
- [5][6] indexに indexOf("bc",0)を代入し、表示する。
- [7][8] indexにindexOf("bc",-2)を代入し、表示する。
- [9][10] indexにindexOf("?!",0)を代入し、表示する。
StringBuilderクラスの文字列検索のサンプルプログラム
このサンプルは、StringBuilderクラスの文字列検索を行うindexOf / lastIndexOfメソッドの機能を示している。文字列が見つかった時だけでなく、みつからならかった場合も含んでいる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public class IndexOfStringBufferBySubstringSearch { public static void main(String[] args) { StringBuffer buffer = new StringBuffer("abcdefabcdef");//[1] int index;//[2] index = buffer.indexOf("bc");//[3] System.out.println("[4] index = " + index); index = buffer.indexOf("bc",0);//[5] System.out.println("[6] index = " + index); index = buffer.indexOf("bc",-2);//[7] System.out.println("[8]index = " + index); index = buffer.indexOf("?!",0);//[9] System.out.println("[10]index = " + index); } } |
実行結果
1 2 3 4 |
[4] index = 1 [6] index = 1 [8]index = 1 [10]index = -1 |
サンプルプログラムの説明
それでは簡単にプログラムの解説をしてゆこう。
- [1] StringBufferクラスのオブジェクトbuilderを、初期値:"abcdefabcdef"で生成する。
- [2] 変数indexを宣言する。
- [3][4] indexにindexOf("bc")を代入し、表示する。
- [5][6] indexにindexOf("bc",0)を代入し、表示する。
- [7][8] indexにindexOf("bc",-2)を代入し、表示する。
- [9][10] indexにindexOf("?!",0)を代入し、表示する。
まとめ
このページでは、indexOfとlastIndexOfについてまとめてご紹介した。
検索のために、様々なクラスに組み込まれているメソッドだ。よく使うメソッドなので使い方を含め覚えてしまおう。