こんにちは、さるまりんです。
Javaで文字列内の文字一つずつに対して何かしていく処理についてです。
例として文字列の中に特定の文字が何度現れるかを数えるプログラムで考えてみたいと思います。
シンプルな繰り返しを使って処理するにはfor
で下のように書くことができると思います。
メソッドにしてみました。
文字列text
の中に文字character
がいくつあるかを数えるプログラムです。
public int countCharInString(String text, char character) {
int count = 0;
for (int i = 0; i < text.length(); i++) {
if (text.charAt(i) == character) count++;
}
return count;
}
文字列の最初から順に文字を見て、それが一致したらカウントcount
を一つずつ増やすことでいくつあるかを数えています。
これ、Java8から使えるStream APIとラムダ式を使うとこんな風に書くこともできます。
public int countCharInStringUsingChars(String text, char character) {
return (int) text.chars().filter(c -> c == character).count();
}
1行になりました。
chars()
メソッドの代わりにcodePoints()
メソッドを使って
public int countCharInStringUsingCodePoints(String text, char character) {
return (int) text.codePoints().filter(c -> c == character).count();
}
実際に呼び出して確かめてみます。
メソッド呼び出し側のプログラムです。
String text = "あなたがあの壁を登るのはいつなのかな。";
char character = 'な';
int count = 0;
count = counter.countCharInString(text, character);
System.out.println("文字「" + character + "」が" + count + "回みつかりました。(for)");
count = counter.countCharInStringUsingChars(text, character);
System.out.println("文字「" + character + "」が" + count + "回みつかりました。(chars())");
count = counter.countCharInStringUsingCodePoints(text, character);
System.out.println("文字「" + character + "」が" + count + "回みつかりました。(codePoints())");
変数counter
は上のメソッドが実装されているクラスのインスタンスです。
実行すると以下が出力されます。
文字「な」が3回みつかりました。(for)
文字「な」が3回みつかりました。(chars())
文字「な」が3回みつかりました。(codePoints())
「あなたがあの壁を登るのはいつなのかな。」
「な」は3つです。
どれも同じ結果ですね。
Stream API、ラムダ式、これまであまり触れてこなかったのですが、しっかり勉強してここにも書いていきたいと思います。そろそろちゃんとしなきゃ。毎日勉強です!
読んでくださってありがとうございました。
それではまた!