1. 概要

Java文字列を操作するとき、文字列に含まれるスペースの数を数えたい場合があります。

結果を得るにはさまざまな方法があります。 このクイックチュートリアルでは、例を通してそれを実行する方法を説明します。

2. 入力文字列の例

まず、例として入力文字列を準備しましょう。

String INPUT_STRING = "  This string has nine spaces and a Tab:'	'";

上記の文字列には、9つのスペースと、一重引用符で囲まれたタブ文字が含まれています。 私たちの目標は、指定された入力文字列内のスペース文字のみをカウントすることです。

したがって、期待される結果は次のとおりです。

int EXPECTED_COUNT = 9;

次に、正しい結果を得るためのさまざまなソリューションを調べてみましょう。

最初にJava標準ライブラリを使用して問題を解決し、次にいくつかの一般的な外部ライブラリを使用して問題を解決します。

最後に、このチュートリアルでは、単体テストメソッドのすべてのソリューションについて説明します。

3. Java標準ライブラリの使用

3.1. 古典的な解決策:ループとカウント

これはおそらく問題を解決するための最も簡単なアイデアです。

入力文字列のすべての文字を調べます。 また、カウンター変数を維持し、スペース文字が表示されたらカウンターをインクリメントします。

最後に、文字列内のスペースの数を取得します。

@Test
void givenString_whenCountSpaceByLooping_thenReturnsExpectedCount() {
    int spaceCount = 0;
    for (char c : INPUT_STRING.toCharArray()) {
        if (c == ' ') {
            spaceCount++;
        }
    }
    assertThat(spaceCount).isEqualTo(EXPECTED_COUNT);
}

3.2. Java8のStreamAPIを使用する

StreamAPIはJava8から登場しています。

さらに、 Java 9以降、新しいchars()メソッドがStringクラスに追加され、char値をStringからIntStreamインスタンスに変換します

Java 9以降を使用している場合は、2つの機能を組み合わせて、1つのライナーで問題を解決できます。

@Test
void givenString_whenCountSpaceByJava8StreamFilter_thenReturnsExpectedCount() {
    long spaceCount = INPUT_STRING.chars().filter(c -> c == (int) ' ').count();
    assertThat(spaceCount).isEqualTo(EXPECTED_COUNT);
}

3.3. 正規表現のMatcher.find()メソッドの使用

これまで、指定された文字列内のスペース文字を検索することでカウントされるソリューションを見てきました。 character ==” を使用して、文字がスペース文字であるかどうかを確認しました。

正規表現(Regex)は、文字列を検索するためのもう1つの強力な武器であり、JavaはRegexを適切にサポートしています。

したがって、単一のスペースをパターンとして定義し、 Matcher.find()メソッドを使用して、入力文字列にパターンが見つかったかどうかを確認できます。

また、スペースの数を取得するために、パターンが見つかるたびにカウンターをインクリメントします。

@Test
void givenString_whenCountSpaceByRegexMatcher_thenReturnsExpectedCount() {
    Pattern pattern = Pattern.compile(" ");
    Matcher matcher = pattern.matcher(INPUT_STRING);
    int spaceCount = 0;
    while (matcher.find()) {
        spaceCount++;
    }
    assertThat(spaceCount).isEqualTo(EXPECTED_COUNT);
}

3.4. String.replaceAll()メソッドの使用

Matcher.find()メソッドを使用してスペースを検索し、見つけるのは非常に簡単です。 ただし、正規表現について話しているので、スペースを数える他の簡単な方法があります。

String.replaceAll()メソッドを使用して「検索と置換」を実行できることはわかっています。

したがって、入力文字列内のすべての非スペース文字を空の文字列に置き換えると、入力からのすべてのスペースが結果になります。

したがって、カウントを取得する場合は、結果の文字列の長さが答えになります。 次に、このアイデアを試してみましょう。

@Test
void givenString_whenCountSpaceByReplaceAll_thenReturnsExpectedCount() {
    int spaceCount = INPUT_STRING.replaceAll("[^ ]", "").length();
    assertThat(spaceCount).isEqualTo(EXPECTED_COUNT);
}

上記のコードが示すように、カウントを取得するための行は1行だけです。

言及する価値があります String.replaceAll() 呼び出し、パターンを使用しました 「[^]」 それ以外の 「\\S」。 これは、空白以外の文字だけでなく、スペース以外の文字を置き換えたいためです。

3.5. String.split()メソッドの使用

String.replaceAll()メソッドを使用したソリューションは、きちんとコンパクトであることがわかりました。 ここで、問題を解決するための別のアイデアを見てみましょう。 String.split()メソッドを使用します。

ご存知のように、パターンを String.split()メソッドに渡して、パターンによって分割された文字列の配列を取得できます。

つまり、アイデアは、 入力文字列を1つのスペースで分割できます。 次に、元の文字列のスペースの数は、文字列配列の長さより1つ少なくなります。

それでは、このアイデアが機能するかどうかを見てみましょう。

@Test
void givenString_whenCountSpaceBySplit_thenReturnsExpectedCount() {
    int spaceCount = INPUT_STRING.split(" ").length - 1;
    assertThat(spaceCount).isEqualTo(EXPECTED_COUNT);
}

4. 外部ライブラリの使用

Apache Commons Lang3ライブラリはJavaプロジェクトで広く使用されています。 また、 Spring は、Java愛好家の間で人気のあるフレームワークです。

どちらのライブラリも、便利な文字列ユーティリティクラスを提供しています。

次に、これらのライブラリを使用して入力文字列のスペースをカウントする方法を見てみましょう。

4.1. Apache CommonsLang3ライブラリの使用

Apache Commons Lang 3ライブラリは、多くの便利な文字列関連メソッドを含むStringUtilクラスを提供しています。

文字列内のスペースをカウントするには、このクラスで countMatches()メソッドを使用できます。

StringUtil クラスの使用を開始する前に、ライブラリがクラスパスにあるかどうかを確認する必要があります。 pom.xml に、最新バージョンとの依存関係を追加できます。

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.12.0</version>
</dependency>

それでは、このメソッドの使用方法を示す単体テストを作成しましょう。

@Test
void givenString_whenCountSpaceUsingApacheCommons_thenReturnsExpectedCount() {
    int spaceCount = StringUtils.countMatches(INPUT_STRING, " ");
    assertThat(spaceCount).isEqualTo(EXPECTED_COUNT);
}

4.2. 春を使う

今日、多くのJavaプロジェクトはSpringフレームワークに基づいています。 したがって、Springを使用している場合は、Springが提供する優れた文字列ユーティリティStringUtilsを使用する準備ができています。

はい、Apache CommonsLang3のクラスと同じ名前です。 さらに、 countOccurrencesOf()メソッドを提供して、文字列内の文字の出現をカウントします。

これはまさに私たちが探しているものです:

@Test
void givenString_whenCountSpaceUsingSpring_thenReturnsExpectedCount() {
    int spaceCount = StringUtils.countOccurrencesOf(INPUT_STRING, " ");
    assertThat(spaceCount).isEqualTo(EXPECTED_COUNT);
}

5. 結論

この記事では、入力文字列内のスペース文字をカウントするためのさまざまなアプローチについて説明しました。

いつものように、記事のコードはGitHubにあります。