Java の indexOf() メソッドで文字列内の単語を検索する方法

JavaBeginner
オンラインで実践に進む

はじめに

この Java プログラミングチュートリアルでは、Java の String 内で単語や文字を検索するための多用途ツールである indexOf() メソッドについて解説します。 indexOf() メソッドは、Java アプリケーションでテキストを扱う上で不可欠であり、より大きな文字列内で特定のコンテンツを検索することを可能にします。このチュートリアルを終える頃には、このメソッドを効果的に使用し、さまざまなシナリオで適用して、Java の文字列処理スキルを向上させる方法を理解できるようになります。

最初の文字列検索プログラムの作成

このステップでは、indexOf() メソッドを使用して文字列内の特定の単語を検索する方法を示す簡単な Java プログラムを作成します。

indexOf() メソッドの理解

indexOf() メソッドは、Java の String クラスに組み込まれた関数で、より大きな文字列内の部分文字列の位置を特定するのに役立ちます。基本的な構文は次のとおりです。

int indexOf(String str)

このメソッドは、指定された部分文字列の最初の出現のインデックス(位置)を返します。部分文字列が見つからない場合、メソッドは -1 を返します。

Java ファイルの作成

indexOf() メソッドの動作を確認するために、最初のプログラムを作成しましょう。

  1. LabEx 環境で WebIDE を開きます。
  2. 「New File」アイコンをクリックするか、File メニューを使用して、新しいファイルを作成します。
  3. ファイル名を StringSearchDemo.java とします。
  4. ファイルに次のコードを入力します。
public class StringSearchDemo {
    public static void main(String[] args) {
        // 検索するサンプル文を作成します
        String sentence = "Java programming is both fun and challenging";

        // indexOf() を使用して単語の位置を検索します
        int position = sentence.indexOf("fun");

        // 結果を表示します
        System.out.println("Original sentence: " + sentence);
        System.out.println("Searching for the word 'fun'");

        if (position != -1) {
            System.out.println("The word 'fun' was found at position: " + position);
        } else {
            System.out.println("The word 'fun' was not found in the sentence");
        }
    }
}

プログラムのコンパイルと実行

それでは、プログラムをコンパイルして実行しましょう。

  1. WebIDE でターミナルを開きます(まだ開いていない場合)。
  2. 次のコマンドを実行して、Java ファイルをコンパイルします。
    javac StringSearchDemo.java
  3. コンパイルされたプログラムを実行します。
    java StringSearchDemo

次のような出力が表示されるはずです。

Original sentence: Java programming is both fun and challenging
Searching for the word 'fun'
The word 'fun' was found at position: 25

結果の確認

出力は、プログラムが文字列内の単語 "fun" を位置 25 で正常に見つけたことを示しています。Java では、文字列のインデックスは 0 から始まるため、26 番目の文字はインデックス 25 にあります。

文字数を数えることで、これを検証できます。「Java programming is both」には正確に 25 文字あり、その後 "fun" が始まります。

別の単語の検索を試す

別の単語を検索するようにプログラムを変更してみましょう。コードで検索語を "fun" から "programming" に変更します。

int position = sentence.indexOf("programming");
System.out.println("Searching for the word 'programming'");

プログラムを再度コンパイルして実行します。

javac StringSearchDemo.java
java StringSearchDemo

これで、次のように表示されるはずです。

Original sentence: Java programming is both fun and challenging
Searching for the word 'programming'
The word 'programming' was found at position: 5

単語 "programming" は位置 5 から始まります。これは、「Java」が 5 文字であるため正しいです。

単語の複数回出現の検索

indexOf() を使用して単語の単一の出現を検索する基本を理解したので、文字列内の単語のすべての出現を検索する方法を学び、スキルを向上させましょう。

2 番目の indexOf() メソッドのシグネチャの理解

indexOf() メソッドには、もう 1 つの便利な形式があります。

int indexOf(String str, int fromIndex)

このバージョンでは、検索の開始位置を指定できます。この形式を使用することにより、各新しい検索を中断した場所から開始して、単語のすべての出現を検索できます。

複数検索プログラムの作成

特定の単語のすべての出現を検索する新しい Java プログラムを作成しましょう。

  1. MultipleFinder.java という名前の新しいファイルを作成します。
  2. 次のコードを入力します。
public class MultipleFinder {
    public static void main(String[] args) {
        // 単語が複数回出現するサンプルテキストを作成します
        String paragraph = "Java is a popular programming language. Java runs on various platforms. " +
                          "Java is used for developing web applications, mobile apps, and more. " +
                          "Learning Java is essential for many software development roles.";

        System.out.println("Original text:");
        System.out.println(paragraph);
        System.out.println("\nSearching for all occurrences of 'Java':");

        // "Java" のすべての出現を検索します
        String searchWord = "Java";
        int position = 0;
        int count = 0;

        // それ以上の出現が見つからなくなるまでループします
        while (position != -1) {
            position = paragraph.indexOf(searchWord, position);

            if (position != -1) {
                count++;
                System.out.println("Occurrence " + count + " found at position: " + position);

                // 次の出現を見つけるために、この出現を過ぎて移動します
                position += searchWord.length();
            }
        }

        System.out.println("\nTotal occurrences found: " + count);
    }
}

複数検索プログラムのコンパイルと実行

それでは、新しいプログラムをコンパイルして実行しましょう。

  1. ターミナルで、Java ファイルをコンパイルします。
    javac MultipleFinder.java
  2. コンパイルされたプログラムを実行します。
    java MultipleFinder

次のような出力が表示されるはずです。

Original text:
Java is a popular programming language. Java runs on various platforms. Java is used for developing web applications, mobile apps, and more. Learning Java is essential for many software development roles.

Searching for all occurrences of 'Java':
Occurrence 1 found at position: 0
Occurrence 2 found at position: 42
Occurrence 3 found at position: 72
Occurrence 4 found at position: 149

Total occurrences found: 4

プログラムの仕組み

このプログラムがすべての出現をどのように見つけるかを詳しく見てみましょう。

  1. 最初の検索位置を 0 (文字列の先頭) に設定します。
  2. indexOf() が -1 (一致がなくなる) を返すまで続く while ループに入ります。
  3. 各一致について、次のことを行います。
    • 単語が見つかった位置を出力します。
    • 検索語の長さを加算して、現在の検索語の後に開始するように検索位置を更新します。
  4. 一致が見つからなくなるまで、ループは続行されます。
  5. 最後に、見つかった出現の総数を出力します。

大文字と小文字の区別を処理する

indexOf() メソッドは、デフォルトで大文字と小文字を区別します。テキストと検索語の両方を小文字に変換して、大文字と小文字を区別しない検索を実行するようにプログラムを変更しましょう。

MultipleFinder.java に、main メソッドの開始直後にこれらの行を追加します。

// 大文字と小文字を区別しない検索のデモンストレーション
System.out.println("\n--- Case-insensitive search ---");
String lowercaseParagraph = paragraph.toLowerCase();
String lowercaseSearchWord = searchWord.toLowerCase();

position = 0;
count = 0;

while (position != -1) {
    position = lowercaseParagraph.indexOf(lowercaseSearchWord, position);

    if (position != -1) {
        count++;
        System.out.println("Occurrence " + count + " found at position: " + position);
        position += lowercaseSearchWord.length();
    }
}

System.out.println("\nTotal occurrences found (case-insensitive): " + count);

更新されたプログラムをコンパイルして実行します。

javac MultipleFinder.java
java MultipleFinder

出力には、大文字と小文字を区別する検索結果と、大文字と小文字を区別しない検索結果の両方が含まれるようになります。

簡単なテキストアナライザーの構築

このステップでは、indexOf() メソッドを使用する実用的なアプリケーションを作成します。特定の単語をカウントし、より大きなテキスト内の位置を特定できる簡単なテキストアナライザーを構築します。

テキストアナライザーの作成

  1. TextAnalyzer.java という名前の新しいファイルを作成します。
  2. 次のコードを入力します。
import java.util.Scanner;

public class TextAnalyzer {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 分析するサンプルテキスト
        String sampleText = "Java is one of the most popular programming languages. Java was developed " +
                          "by Sun Microsystems. Today, Java is used to develop mobile apps, web applications, " +
                          "desktop applications, games and much more. Java is known for its simplicity, " +
                          "object-oriented features, and platform independence.";

        System.out.println("Text Analyzer Program");
        System.out.println("=====================");
        System.out.println("\nText to analyze:");
        System.out.println(sampleText);

        // 検索する単語をユーザーに尋ねます
        System.out.print("\nEnter a word to search for: ");
        String searchWord = scanner.nextLine();

        // テキストを分析するためのメソッドを呼び出します
        int occurrences = countOccurrences(sampleText, searchWord);

        // 結果を表示します
        System.out.println("\nAnalysis Results:");
        System.out.println("----------------");
        System.out.println("Word searched for: \"" + searchWord + "\"");
        System.out.println("Number of occurrences: " + occurrences);

        // 単語が見つかった場合、位置を表示します
        if (occurrences > 0) {
            System.out.println("\nPositions where \"" + searchWord + "\" appears:");
            findPositions(sampleText, searchWord);
        }

        // 単語がテキストの何パーセントを占めるかを計算します
        if (occurrences > 0) {
            // この単語がテキストの何パーセントを占めるかを計算します
            double percentage = (double)(searchWord.length() * occurrences) / sampleText.length() * 100;
            System.out.printf("\nThe word \"%s\" makes up %.2f%% of the total text.\n",
                              searchWord, percentage);
        }

        scanner.close();
    }

    // テキスト内の単語の出現回数をカウントするメソッド
    public static int countOccurrences(String text, String word) {
        int count = 0;
        int position = 0;

        while (position != -1) {
            position = text.indexOf(word, position);

            if (position != -1) {
                count++;
                position += word.length();
            }
        }

        return count;
    }

    // 単語のすべての位置を検索して表示するメソッド
    public static void findPositions(String text, String word) {
        int position = 0;
        int occurrence = 0;

        while (position != -1) {
            position = text.indexOf(word, position);

            if (position != -1) {
                occurrence++;
                System.out.println("  Occurrence " + occurrence + ": Position " + position +
                                  " (ends at position " + (position + word.length() - 1) + ")");

                // 単語の周囲のコンテキストを表示します
                int contextStart = Math.max(0, position - 10);
                int contextEnd = Math.min(text.length(), position + word.length() + 10);
                String context = text.substring(contextStart, contextEnd);

                // コンテキストで単語を強調表示します
                System.out.print("  Context: ");
                if (contextStart > 0) {
                    System.out.print("...");
                }

                System.out.print(context);

                if (contextEnd < text.length()) {
                    System.out.print("...");
                }
                System.out.println("\n");

                position += word.length();
            }
        }
    }
}

テキストアナライザーのコンパイルと実行

それでは、テキストアナライザーをコンパイルして実行しましょう。

  1. ターミナルで、Java ファイルをコンパイルします。

    javac TextAnalyzer.java
  2. コンパイルされたプログラムを実行します。

    java TextAnalyzer
  3. プロンプトが表示されたら、Java などの検索する単語を入力します。

次のような出力が表示されるはずです。

Text Analyzer Program
=====================

Text to analyze:
Java is one of the most popular programming languages. Java was developed by Sun Microsystems. Today, Java is used to develop mobile apps, web applications, desktop applications, games and much more. Java is known for its simplicity, object-oriented features, and platform independence.

Enter a word to search for: Java

Analysis Results:
----------------
Word searched for: "Java"
Number of occurrences: 4

Positions where "Java" appears:
  Occurrence 1: Position 0 (ends at position 3)
  Context: ...Java is one o...

  Occurrence 2: Position 48 (ends at position 51)
  Context: ...guages. Java was dev...

  Occurrence 3: Position 93 (ends at position 96)
  Context: ...Today, Java is used...

  Occurrence 4: Position 197 (ends at position 200)
  Context: ...more. Java is know...

The word "Java" makes up 1.67% of the total text.

テキストアナライザーの理解

テキストアナライザーは次のことを行います。

  1. 分析するサンプルテキストを表示します。
  2. ユーザーに検索する単語を入力するように求めます。
  3. テキスト内で単語が何回出現するかをカウントします。
  4. 単語が出現する位置を表示します。
  5. 各出現について、周囲のコンテキストを表示します。
  6. 検索語がテキスト全体の何パーセントを占めるかを計算します。

このアプリケーションは、テキスト分析における indexOf() メソッドの実用的な使用法を示しています。プログラムは、次のようなより多くの機能を含めるように拡張できます。

  • 大文字と小文字を区別しない検索
  • 単語の一部ではなく、単語全体のみを検索する
  • 複数の単語を一度に分析する
  • テキストに関する統計を生成する

さまざまな入力を試して、プログラムを異なる検索語で再度実行し、その動作を確認してください。

まとめ

このチュートリアルでは、Java で indexOf() メソッドを使用して文字列内の単語を検索する方法を学びました。次の点を習得しました。

  1. indexOf() を使用して、文字列内の単語の最初の出現箇所を検索する
  2. ループと indexOf() の 2 番目の形式を使用して、単語のすべての出現箇所を検索する
  3. 文字列を小文字に変換して、大文字と小文字を区別しない検索を実行する
  4. indexOf() メソッドの実際の使用法を示す実用的なテキストアナライザーアプリケーションを構築する

これらの文字列操作スキルは、Java プログラミングの基本であり、データ処理、ユーザー入力検証、テキスト分析など、さまざまなプログラミングタスクで役立ちます。文字列の特定の部分を特定して操作する方法を理解することで、より洗練された、ユーザーフレンドリーなアプリケーションを構築できます。

Java の学習を続ける中で、substring()replace()、正規表現などの他の String メソッドを調べて、これらの概念を拡張し、より高度なテキスト処理を行うことができます。