はじめに
Java では、特定の文字が文字列中に何回出現するかを簡単に数えることができます。この実験(Lab)では、文字列中の文字の出現回数を数えるために使用できるさまざまな方法について説明します。
反復アプローチ
特定の文字が出現する回数を数えるために、文字列内の各文字を反復処理する反復アプローチを使用できます。
~/project ディレクトリに CountOccurrences.java という名前の Java ファイルを作成し、以下の内容をファイルにコピーします。
public class CountOccurrences {
public static int countChars(String str, char c) {
int count = 0;
for(int i = 0; i < str.length(); i++) {
char currChar = str.charAt(i);
if(currChar == c)
count += 1;
}
return count;
}
public static void main(String[] args) {
String s = "Java is an awesome language!";
int charCountOfA = countChars(s, 'a');
int charCountOfG = countChars(s, 'g');
int charCountOfE = countChars(s, 'e');
System.out.println("The String is: " + s);
System.out.println("Character count of 'a': " + charCountOfA);
System.out.println("Character count of 'g': " + charCountOfG);
System.out.println("Character count of 'e': " + charCountOfE);
}
}
プログラムをコンパイルして実行するには、ターミナルで次のコマンドを実行します。
cd ~/project
javac CountOccurrences.java && java CountOccurrences
出力は次のようになります。
The String is: Java is an awesome language!
Character count of 'a': 6
Character count of 'g': 2
Character count of 'e': 3
再帰アプローチ
文字列中の文字の出現回数を数えるために、再帰アプローチを使用することもできます。これには、2 つのメソッドを使用し、最初のメソッドが再帰的で、2 番目のメソッドが最初のメソッドを呼び出すことが含まれます。
CountOccurrences.java ファイルのステップ 1 のコードブロックの後に、次のコードブロックをコピーして貼り付けます。
public static int countCharsRecur(String str, char c, int idx) {
if(idx >= str.length())
return 0;
else {
int count = 0;
if(str.charAt(idx) == c)
count = 1;
return count + countCharsRecur(str, c, idx + 1);
}
}
public static int countChars(String s, char c) {
return countCharsRecur(s, c, 0);
}
更新されたプログラムをコンパイルして実行するには、ステップ 1 と同じコマンドを実行します。
cd ~/project
javac CountOccurrences.java && java CountOccurrences
Java 8 Streams の利用
Java 8 Streams を使用して、文字列内の文字の出現回数を数えることができます。
CountOccurrences.java ファイルのステップ 2 のコードブロックの後に、次のコードブロックをコピーして貼り付けます。
public static void usingStreams(String s) {
int charCountOfA = (int) s.chars().filter(c -> c == 'a').count();
int charCountOfG = (int) s.chars().filter(c -> c == 'g').count();
int charCountOfE = (int) s.chars().filter(c -> c == 'e').count();
System.out.println("The String is: " + s);
System.out.println("Character count of 'a': " + charCountOfA);
System.out.println("Character count of 'g': " + charCountOfG);
System.out.println("Character count of 'e': " + charCountOfE);
}
Java 8 Streams メソッドを使用するには、ステップ 2 のコードブロックの後に、次のコード行を main メソッドに追加します。
usingStreams(s);
更新されたプログラムをコンパイルして実行するには、ステップ 1 と同じコマンドを実行します。
cd ~/project
javac CountOccurrences.java && java CountOccurrences
外部ライブラリの使用
文字列内の文字の出現回数を数えるために、外部ライブラリを使用できます。
Guava ライブラリの使用
Guava ライブラリは、指定された文字の出現回数を数えることができる CharMatcher クラスを提供します。
ステップ 3 のコードブロックの後に、次のコードブロックを追加します。
public static int usingGuava(String str) {
CharMatcher cm = CharMatcher.is('a');
int charCountOfA = cm.countIn(str);
System.out.println("Character count of 'a': " + charCountOfA);
return charCountOfA;
}
Guava ライブラリを使用するには、CountOccurrences.java ファイルの先頭に次のインポートを追加します。
import com.google.common.base.CharMatcher;
main メソッドで、文字列パラメータを使用して usingGuava メソッドを呼び出します。
usingGuava(s);
更新されたプログラムをコンパイルして実行するには、ステップ 1 と同じコマンドを実行します。
cd ~/project
javac -cp ".:./lib/*" CountOccurrences.java && java -cp ".:./lib/*" CountOccurrences
Apache ライブラリの使用
Apache Commons ライブラリは、文字と文字列を入力として受け取り、その文字列内の文字のカウントを出力として返す便利な countMatches() メソッドを持つ StringUtils クラスを提供します。
ステップ 4 のコードブロックの後に、次のコードブロックを追加します。
public static int usingApache(String str) {
int charCountOfA = StringUtils.countMatches(str, 'a');
int charCountOfG = StringUtils.countMatches(str, 'g');
int charCountOfE = StringUtils.countMatches(str, 'e');
System.out.println("Character count of 'a': " + charCountOfA);
System.out.println("Character count of 'g': " + charCountOfG);
System.out.println("Character count of 'e': " + charCountOfE);
return charCountOfA;
}
Apache Commons ライブラリを使用するには、CountOccurrences.java ファイルの先頭に次のインポートを追加します。
import org.apache.commons.lang3.StringUtils;
main メソッドで、文字列パラメータを使用して usingApache メソッドを呼び出します。
usingApache(s);
更新されたプログラムをコンパイルして実行するには、ステップ 1 と同じコマンドを実行し、クラスパスを追加します。
cd ~/project
javac -cp ".:./lib/*" CountOccurrences.java && java -cp ".:./lib/*" CountOccurrences
まとめ
この実験では、次の手順を扱いました。
- 反復アプローチ - 各文字を走査して、文字の出現回数をカウントします。
- 再帰的アプローチ - 再帰を使用して、文字の出現回数をカウントします。
- Java 8 Streams - Streams を使用して、文字の出現回数をカウントします。
- 外部ライブラリ - Guava および Apache ライブラリを使用して、文字の出現回数をカウントします。
この実験を完了すると、文字列内の文字の出現回数をカウントするためのさまざまな方法について、より深く理解できるはずです。



