1. 概要

JavaのStringでのcharの出現回数をカウントする方法はたくさんあります。

このクイックチュートリアルでは、文字をカウントする方法のいくつかの例に焦点を当てます。最初にコアJavaライブラリを使用し、次にSpringやGuavaなどの他のライブラリとフレームワークを使用します。

2. CoreJavaLibの使用

2.1. 命令型アプローチ

一部の開発者は、コアJavaの使用を好む場合があります。 文字列内のcharの出現回数をカウントする方法はたくさんあります。

シンプルでナイーブなアプローチから始めましょう。

String someString = "elephant";
char someChar = 'e';
int count = 0;
 
for (int i = 0; i < someString.length(); i++) {
    if (someString.charAt(i) == someChar) {
        count++;
    }
}
assertEquals(2, count);

当然のことながら、これは機能しますが、これを行うためのより良い方法があります。

2.2. 再帰の使用

あまり明白ではありませんが、それでも興味深い解決策は、再帰を使用することです。

private static int countOccurences(
  String someString, char searchedChar, int index) {
    if (index >= someString.length()) {
        return 0;
    }
    
    int count = someString.charAt(index) == searchedChar ? 1 : 0;
    return count + countOccurences(
      someString, searchedChar, index + 1);
}

この再帰メソッドは、 useRecursionToCountChars( “elephant”、’e’、0)の方法で呼び出すことができます。

2.3. 正規表現の使用

別の方法は、正規表現を使用することです。

Pattern pattern = Pattern.compile("[^e]*e");
Matcher matcher = pattern.matcher("elephant");
int count = 0;
while (matcher.find()) {
    count++;
}
 
assertEquals(2, count);

このソリューションは技術的には正しいが最適ではないことに注意してください。文字列内の文字の出現回数を見つけるなどの単純な問題を解決するために非常に強力な正規表現を使用するのはやり過ぎです。

2.4. Java8機能の使用

ここでは、Java8で利用可能な新機能が非常に役立ちます。

ストリームとラムダを使用してカウントを実装しましょう。

String someString = "elephant";
long count = someString.chars().filter(ch -> ch == 'e').count();
assertEquals(2, count);

long count2 = someString.codePoints().filter(ch -> ch == 'e').count();
assertEquals(2, count2);

したがって、これは明らかにコアライブラリを使用したよりクリーンで読みやすいソリューションです。

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

次に、外部ライブラリのユーティリティを利用するいくつかのソリューションを見てみましょう。

3.1. Using StringUtils

一般に、独自のソリューションを発明するのではなく、既存のソリューションを使用する方が常に優れています。 commons.lang.StringUtils クラスは、 countMatches()メソッドを提供します。このメソッドは、指定されたStringの文字またはサブ文字列をカウントするために使用できます。

まず、適切な依存関係を含める必要があります。

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

最新バージョンはMavenCentralで見つけることができます。

ここで、 countMatches()を使用して、「象」文字列リテラルのe文字の数をカウントしましょう。

int count = StringUtils.countMatches("elephant", "e");
assertEquals(2, count);

3.2. グアバの使用

グアバは、文字を数えるのにも役立ちます。 依存関係を定義する必要があります。

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>31.0.1-jre</version>
</dependency>

最新バージョンはMavenCentralで見つけることができます。

グアバが文字を数えるのにどのように素早く役立つか見てみましょう:

int count = CharMatcher.is('e').countIn("elephant");
assertEquals(2, count);

3.3. 春を使う

当然、文字を数えるためだけにSpringFrameworkをプロジェクトに追加することは意味がありません。

ただし、プロジェクトにすでに含まれている場合は、 countOccurencesOf()メソッドを使用する必要があります。

int count = StringUtils.countOccurrencesOf("elephant", "e");
assertEquals(2, count);

4. 結論

この記事では、文字列内の文字をカウントするさまざまな方法に焦点を当てました。 それらのいくつかは純粋にJavaで設計されました。 いくつかの追加のライブラリが必要でした。

StringUtils 、Guava、またはSpringの既存のユーティリティを使用することをお勧めします。 ただし、この記事では、プレーンJavaのみを使用することが望ましい場合に、Java8でそれを実行するためのいくつかの可能性を提供します。

これらの例の完全なソースコードは、このGitHubプロジェクトで入手できます。