「確認作業」はどの職にも必ず必須の工程であることは皆さんよくご存じだと思いますが、ことJavaの世界でもこの確認作業は大切な工程と言えます。
そこで今回はこの確認作業の一つでもある”contains“についての解説をしてみようと思います。
必要な時に忘れがちな「○○が含まれているかどうか?の確認方法」もこの記事を読めばすぐ思い出せるよう書いてみたいと思いますので、最後までお付き合いください。
目次
“contains”メソッドについて
まずどんな確認作業をするかという部分が大事となってきますが、例えば「○○には○○が含まれているかどうか…」ということに関しては、”contains”メソッドを使って調べることが出来ます。
この”contains”ですが、含まれていれば”true”、含まれていなければ”false”という具合に、戻り値はBoolean型となります。
では使えるシーンは?というと、String、配列、List、Mapなど様々なものに対応しています。
では早速、実際のコードを踏まえながら解説していきましょう。
Stringで”contains”を使う
文字列で”contains”を使う場合にはString.containsを使用します。
こうすることで文字列の中に引数で指定した文字列が含まれているかどうかを判定することが出来ます。
記述ルールは以下の通りです。
public boolean contains(CharSequence s)
簡単に説明をすると、”CharSequence s”には検索したいシーケンスを入力します。
実際のコードで見てみましょう。
public class ContainsSample { public static void main(String[] args) { String s = "Sample String"; if (s.contains("Str")) { System.out.println("含まれています"); } } }
実行結果
含まれています
このコードでは、if文で”contains”メソッドを使用し引数に”Str”を指定することで、メンバ変数sの文字列「Sample String」に対して判定を行っています。
変数に設定されている文字列の中に”Str”が含まれるので、実行結果ではif文でtrue時の処理がされていることが分かります。
これとは別の方法として、”indexOf”メソッドを使用して判定する方法もあります。
次の項目ではこの”indexOf”メソッドを使った方法も併せて解説していきます。
“String.indexOf“で検索する
“String.contains”で検索する方法とは別に”String.indexOf”で検索する方法も存在します。
こちらの検索方法は、検索したい文字列が検索対象に最初に出現するインデックスを返すのが特徴です。
戻り値は”0(ゼロ)”から始まる数値で表されます。
検索対象に検索する文字列が含まれていない場合には”-1″となります。
簡単に解釈するなら、戻り値が-1以外なら検索対象に検索した文字列が存在するということになります。
記述ルールは以下の通りとなります。
public int indexOf(String str)
引数の部分には検索したい文字列を入力します。
では早速コードを見てみましょう。
public class ContainsSample { public static void main(String[] args) { String s = "sample String"; int index = s.indexOf("Str"); if (index != -1) { System.out.println(index); } } }
実行結果
7
このコードでは”indexOf”で指定した文字列が含まれているかどうかをif文を使って判定しています。
検索対象である「Sample String」には”Str”が含まれているため、if文のtrue時の処理でインデックスを出力させることが出来ます。
実行結果でもわかるように、「Sample String」の中に”0(ゼロ)”から数えて7番目に検索したい文字列が存在していることが確認できます。
また、この”indexOf”メソッドの第二引数で検索開始位置を指定することも出来ます。
配列で”contains”を使う
“contains”を配列に対して使用する場合には、一般的にfor構文を使ってループ検索をかけます。
for構文は比較的自由に条件を指定できるため、使い勝手は良いでしょう。
では早速コードを見てみましょう。
public class ContainsSample { public static void main(String[] args) { String[] arr = {"Sa", "mp", "le", "St", "ri", "ng"}; boolean contains = false; for (String s : arr) { if(s.equals("le")) { contains = true; break; } } if(contains) { System.out.println("含まれています"); } } }
実行結果
含まれています
このコードでは、配列であるarrをfor文を使ってループさせ、その都度if文で判定を行っています。
“equals”メソッドは文字列を比較して等しい場合に“true”を返します。
検索対象であるarr内に”le”という検索指定した文字列が見つかった場合、”contains”の値をfalseからtrueに変更しbreakでループを抜けさせ、最後に二つ目のif文のtrue時の処理を実行させています。
配列の中には”le”という要素が存在しますので、実行結果では「含まれています」と出力されていることが確認できます。
Listで”contains”を使う
Listで判定を行う場合には配列をリストに変換し、その後にif文で判定をかけます。
実際のコードは次のようになります。
import java.util.Arrays; import java.util.List; public class ContainsSample { public static void main(String[] args) { String[] arr = {"Sa", "mp", "le", "St", "ri", "ng"}; List l = Arrays.asList(arr); if(l.contains("St")) { System.out.println("含まれています"); } } }
実行結果
含まれています
“List.contains”はその特徴として、List中に含まれるかどうかの判定が行えます。
よって、配列ではfor文を使ってループ判定をさせる必要が有るのに対しListに変換することでList全体を一度に判定出来るため、スッキリとしたコード記述が可能になります。
但し”List.contains”を使用する場合には、自作クラスに限り”equals”をオーバーライドしていないと判定が出来ない点に注意してください。
逆に標準APIでは、もともとequalsが基本実装されているので特に気にする必要はありません。
Mapで”contains”を使う
Mapも同じように”contains”メソッドが利用可能です。
Mapはどのシーンでも使用頻度はかなり高いため、”contains”メソッドと併せることで非常に作業効率が上がります。
Mapはキーと値が対となっているため、キーには”Map.containsKey”を、値には”Map.containsValue”を使い判定を行います。
記述ルールは以下の通りです。
// Map.containsKey boolean containsKey(Object key) // Map.containsValue boolean containsValue(Object value)
では実際のコードを見てみましょう。
import java.util.HashMap; import java.util.Map; public class ContainsSample { public static void main(String[] args) { Map<String, String> m = new HashMap<>(); m.put("Aa", "あ"); m.put("Bb", "い"); m.put("Cc", "う"); m.put("Dd", "え"); m.put("Ee", "お"); if (m.containsKey("Cc")) { System.out.println("キー:含まれています"); } if (m.containsValue("え")) { System.out.println("値:含まれています"); } } }
実行結果
キー:含まれています 値:含まれています
まとめ
いかがでしたか?
今回は”contains”について解説してみました。
確認作業は本当によく使うものでありながらも使用するパターンの数が少ない為、比較的楽に覚えることができると同時に即実践で使うことができます。
またこれらを積極的に使うことで人為的なミスも劇的に減る為、優先的に覚えることをお勧めします。