Java の配列の中から特定の値を探す方法(線形探索)
新人
「Java で配列の中から特定の値を探すにはどうすればいいですか?」
先輩
「配列の要素を順番にチェックして探す方法があるよ。これは線形探索(リニアサーチ)と呼ばれるんだ。」
新人
「線形探索って何ですか?」
先輩
「配列の要素を最初から1つずつ調べて、探している値と一致するか確認する方法だよ。詳しく見ていこう!」
1. Java の配列とは?(基本的な説明)
Java の配列とは、同じ種類のデータを複数まとめて管理するための仕組みです。配列を使うことで、多くのデータを一つの変数で管理できます。
配列の基本構文
public class ArrayExample {
public static void main(String[] args) {
// 5つの整数を格納する配列を作成
int[] numbers = {10, 20, 30, 40, 50};
// 配列の中身を表示
System.out.println("1つ目の値: " + numbers[0]);
}
}
1つ目の値: 10
2. 配列の中から特定の値を探す方法とは?(概要説明)
配列の中から特定の値を探す方法はいくつかありますが、最もシンプルな方法は線形探索(リニアサーチ)です。
線形探索とは、配列の先頭から順番に探している値を比較し、一致するかどうかをチェックする方法です。
線形探索の基本的な考え方
- 1. 配列の先頭から順番に要素を調べる
- 2. 探している値と一致するか比較する
- 3. 一致すればそのインデックスを返す
- 4. 配列の最後まで調べても見つからなければ「見つからない」とする
線形探索の流れ
public class LinearSearch {
public static void main(String[] args) {
// 探したいデータが入った配列
int[] numbers = {10, 20, 30, 40, 50};
int target = 30; // 探したい値
// 探索処理
boolean found = false;
for (int i = 0; i < numbers.length; i++) {
if (numbers[i] == target) {
System.out.println(target + " はインデックス " + i + " にあります。");
found = true;
break;
}
}
// 見つからなかった場合
if (!found) {
System.out.println(target + " は見つかりませんでした。");
}
}
}
30 はインデックス 2 にあります。
このように、線形探索を使うと配列の中から特定の値を探し出すことができます。
3. 線形探索(リニアサーチ)の基本的な方法
線形探索(リニアサーチ)は、配列の中から特定の値を探す最もシンプルな方法です。
配列の最初の要素から順番に調べ、探している値が見つかるまでチェックします。
線形探索の手順
- 1. 配列の最初の要素から順番に調べる
- 2. 各要素を探している値と比較する
- 3. 一致したら、そのインデックスを返す
- 4. 配列の最後まで探しても見つからなければ「見つからない」とする
線形探索は、配列のサイズに関係なく実装しやすいですが、大きなデータになると処理時間が長くなることがあります。
4. 線形探索を使ったサンプルコード
それでは、線形探索を使って配列の中から特定の値を探す方法を具体的に見ていきましょう。
以下のコードは、整数の配列の中から特定の値を探し、そのインデックスを表示するプログラムです。
public class LinearSearchExample {
public static void main(String[] args) {
// 探索する配列
int[] numbers = {5, 12, 9, 25, 30, 18, 7};
int target = 25; // 探したい値
// 線形探索の実行
int index = linearSearch(numbers, target);
// 結果の表示
if (index != -1) {
System.out.println(target + " はインデックス " + index + " にあります。");
} else {
System.out.println(target + " は見つかりませんでした。");
}
}
// 線形探索のメソッド
public static int linearSearch(int[] array, int key) {
for (int i = 0; i < array.length; i++) {
if (array[i] == key) {
return i; // 見つかった場合のインデックスを返す
}
}
return -1; // 見つからなかった場合
}
}
25 はインデックス 3 にあります。
このように、for ループを使って配列の要素を順番にチェックし、一致する値を見つけたらインデックスを返します。
5. 線形探索の処理の流れとポイント
線形探索の処理は、基本的に以下のような流れで進みます。
線形探索の処理の流れ
- 1. 配列を最初の要素から順番にチェックする
- 2. 探している値と一致するか比較する
- 3. 一致した場合、そのインデックスを返す
- 4. 最後まで見つからなければ -1 を返す
この方法を使えば、配列のデータが整列されていなくても簡単に検索できます。
線形探索のポイント
- ✔ 配列のサイズが小さい場合は、シンプルで効率的な方法
- ✔ 配列が大きくなると、処理時間が長くなるため注意が必要
- ✔ データが並んでいない(ソートされていない)場合でも使える
線形探索は、配列のすべての要素を調べるため、最悪の場合は配列の長さ分のチェックが必要になります。そのため、より速い検索が必要な場合は、二分探索(バイナリサーチ)などの方法を検討するとよいでしょう。
6. 線形探索のメリットとデメリット
線形探索は最もシンプルな検索アルゴリズムですが、メリットとデメリットがあります。
メリット
- ✔ 実装が簡単で初心者でもすぐに理解できる
- ✔ ソートされていない配列でも使用可能
- ✔ 配列の要素数が少ない場合は十分に速い
デメリット
- ✖ 配列の要素数が増えると処理時間が長くなる
- ✖ 最悪の場合、配列全体をチェックする必要がある
- ✖ 検索回数が多い場合は非効率
大規模なデータを扱う場合は、より高速な 二分探索(バイナリサーチ) や ハッシュ検索 などの方法を検討するとよいでしょう。
7. 線形探索を応用した実践例
ここでは、線形探索を応用して、複数の値を探す例を紹介します。
以下のコードは、配列の中にある指定した値をすべて探し、そのインデックスを表示するプログラムです。
import java.util.ArrayList;
public class LinearSearchMultiple {
public static void main(String[] args) {
// 検索対象の配列
int[] numbers = {5, 12, 9, 25, 30, 9, 18, 7, 9};
int target = 9; // 探したい値
// 線形探索の実行
ArrayList<Integer> indices = linearSearchMultiple(numbers, target);
// 結果の表示
if (!indices.isEmpty()) {
System.out.println(target + " はインデックス " + indices + " にあります。");
} else {
System.out.println(target + " は見つかりませんでした。");
}
}
// 線形探索のメソッド(複数の値を検索)
public static ArrayList<Integer> linearSearchMultiple(int[] array, int key) {
ArrayList<Integer> result = new ArrayList<>();
for (int i = 0; i < array.length; i++) {
if (array[i] == key) {
result.add(i);
}
}
return result;
}
}
9 はインデックス [2, 5, 8] にあります。
このプログラムでは、配列のすべての要素をチェックし、該当する値が見つかったインデックスをリストに保存して表示します。
8. 練習問題:「配列の中から特定の値を探してみよう」
次の問題に挑戦してみましょう!
問題
次の配列から、指定した値が何回出現するかを調べるプログラムを作成してください。
public class CountOccurrences {
public static void main(String[] args) {
// 配列の定義
int[] numbers = {4, 7, 2, 7, 9, 7, 3, 7, 1};
int target = 7; // 探したい値
// 値の出現回数をカウント
int count = countOccurrences(numbers, target);
// 結果の表示
System.out.println(target + " は " + count + " 回出現しました。");
}
// 指定した値の出現回数をカウントするメソッド
public static int countOccurrences(int[] array, int key) {
int count = 0;
for (int num : array) {
if (num == key) {
count++;
}
}
return count;
}
}
7 は 4 回出現しました。
解答のポイント
- ✔ 配列のすべての要素を順番にチェックする
- ✔ 探している値と一致する場合、カウンターを増やす
- ✔ 最終的なカウント数を表示する
この問題に挑戦しながら、線形探索の考え方をしっかり身につけましょう!