【Java】binarySearchを使って配列(Array)の要素から値を検索する!
配列(Array)の要素から値を検索するにはArrayクラスのbinarySearchメソッドを使用します。
ArraysクラスのbinarySearchメソッドは、ソートされた配列内の要素を検索するメソッドとなります。
binarySearchメソッドを使用することで、追加したい要素が既に配列の中に入っているのか確認することができ、追加するのか更新するのか判断することができます。
その為、配列の要素が把握できなくなった場合に、配列の要素チェックとしてbinarySearchメソッドを使いましょう。
今回はArraysクラスのbinarySearchメソッドを使って以下の場合で配列(Array)の要素から値を検索していきます。
⚫︎ 配列に検索したい要素が存在する状態で検索する場合
⚫︎ 配列に検索したい要素が存在しない状態で検索する場合
⚫︎ 配列に検索したい要素が複数存在する状態で検索する場合
目次
binarySearchメソッドとは
ArrayクラスのbinarySearchメソッドとは、ソートされた配列内の要素を検索するメソッドです
ソートされた配列なので、配列をソートしていないと正しい結果が返ってきませんので注意してください。
binarySearchメソッドの書き方
AarrayクラスのbinarySearchメソッドの構文は下記となります。
1 2 3 |
import java.util.Arrays; Arrays.binarySearch(配列, 検索したい要素); |
Arrayクラスをインポートすることで、Arraysクラスのメソッドを使用できます。
パラメータ
⚫︎ 配列:
検索対象の配列を指定する
⚫︎ 検索したい要素:
配列の中で検索したい要素を指定する
そして、binarySearchの()に第1パラメータとして配列を、第2パラメータとして検索したい要素を指定することで配列の中に検索したい要素があるかどうか調べることができます。
binarySearchメソッドの注意点
binarySearchメソッドをそのまま使用した場合、正しい結果を返すことができません。
例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
// 配列の要素から値を検索する import java.util.Arrays; public class Main { public static void main(String[] args) throws Exception { // 配列を作成 int[] arrayA = {12, 65, 92, 2, 84, 23, 11, 23, 45}; // 配列の内容を表示 System.out.println(Arrays.toString(arrayA)); // 92を配列内から検索する int target1 = 92; int pos = Arrays.binarySearch(arrayA, target1); System.out.println(target1 + "は" + pos + "番目の要素"); } } |
出力結果
[12, 65, 92, 2, 84, 23, 11, 23, 45]
92は-10番目の要素
92は配列内にありますが、負の整数を返しています。
正しい結果を返すためにはbinarySearchメソッドを使う前にsortメソッドで配列の要素を並び替える必要があります。
配列の要素から値を検索するサンプルコード
配列の要素から値を検索するサンプルコードを紹介します。
検索したい要素がある場合
例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
// 配列の要素から値を検索する import java.util.Arrays; public class Main { public static void main(String[] args) throws Exception { // 配列を作成 int[] array1 = {12, 65, 92, 2, 84, 23, 11, 45}; // 配列の内容を表示 System.out.println("・ ソート前"); System.out.println(Arrays.toString(array1)); // ソートを実行 // ソートを行ってからでないと正しく検索できない Arrays.sort(array1); //配列の内容を表示 System.out.println("・ ソート後"); System.out.println(Arrays.toString(array1)); // 23を配列内から検索する int target = 23; int pos = Arrays.binarySearch(array1, target); System.out.println(target + "は" + pos + "番目の要素"); } } |
出力結果
・ ソート前
[12, 65, 92, 2, 84, 23, 11, 45]
・ ソート後
[2, 11, 12, 23, 45, 65, 84, 92]
23は3番目の要素
配列をソートした後、binarySearchメソッドによって配列の中にある要素を検索し、インデックスを返しています。
検索したい要素が見当たらない場合
例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
// 配列の要素から値を検索する import java.util.Arrays; public class Main { public static void main(String[] args) throws Exception { // 配列を作成 int[] array2 = {12, 65, 92, 2, 84, 23, 11, 23, 45}; // 配列の内容を表示 System.out.println("・ ソート前"); System.out.println(Arrays.toString(array)); // ソートを実行 // ソートを行ってからでないと正しく検索できない Arrays.sort(array2); //配列の内容を表示 System.out.println("・ ソート後"); System.out.println(Arrays.toString(array2)); // 111を配列内から検索する int target1 = 111; int pos = Arrays.binarySearch(array2, target1); int target2 = 30; int pos2 = Arrays.binarySearch(array2, target2); System.out.println(target1 + "は" + pos + "番目の要素"); System.out.println(target2 + "は" + pos2 + "番目の要素"); } } |
出力結果
・ ソート前
[12, 65, 92, 2, 84, 23, 11, 23, 45]
・ ソート後
[2, 11, 12, 23, 23, 45, 65, 84, 92]
111は-10番目の要素
30は-6番目の要素
配列をソートした後、検索した値が配列内になかった場合は負の整数の値を戻します。
検索したい要素が複数ある場合
例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
// 配列の要素から値を検索する import java.util.Arrays; public class Main { public static void main(String[] args) throws Exception { // 配列を作成 int[] array3 = {12, 65, 92, 2, 84, 23, 11, 23, 45, 92}; // 配列の内容を表示 System.out.println("・ ソート前"); System.out.println(Arrays.toString(array3)); // ソートを実行 // ソートを行ってからでないと正しく検索できない Arrays.sort(array); //配列の内容を表示 System.out.println("・ ソート後"); System.out.println(Arrays.toString(array3)); // 92を配列内から検索する int target1 = 92; int pos = Arrays.binarySearch(array3, target1); System.out.println(target1 + "は" + pos + "番目の要素"); } } |
出力結果
・ ソート前
[12, 65, 92, 2, 84, 23, 11, 23, 45, 92]
・ ソート後
[2, 11, 12, 23, 23, 45, 65, 84, 92, 92]
92は8番目の要素
配列をソートした後、検索したい要素が複数ある場合は配列のインデックスが小さい方の番号が取り出されます。
今回のポイント
binarySearchで配列の要素から値を検索
配列の要素から値を検索するにはArraysクラスのbinarySearchメソッドを使用する。
⚫︎ ArraysクラスのbinarySearchメソッドで配列の中から任意の要素を検索する
⚫︎ 検索対象の配列は、ソートされていないと正しい結果が返らない
⚫︎ binarySearchメソッドの第1パラメータには検索対象の配列、第2パラメータには検索する値を指定する
⚫︎ binarySearchメソッドは配列内の何番目に対象の値、先頭にある場合は「0」を戻し、値が配列内になかった場合は「0未満」の値を戻り値として返す
⚫︎ ソート後に同じ値が配列内に複数あった場合にbinarySearchメソッドを使用すると、小さい方のインデックスを返す
関連記事
配列の要素を並び替えるArraysクラスのsortメソッドについてはこちらをご参考ください
ST
株式会社flyhawkのSTです。フライテックメディア事業部でのメディア運営・ライター業務なども担当。愛機はMac Book AirとThinkPad。好きな言語:swift、JS系(Node.js等)。好きなサーバー:AWS。受託開発やプログラミングスクールの運営をしております。ご気軽にお問い合わせください。