テキスト内のすべての文字の頻度を数えて印刷しようとしています。 Array
またはArrayList
を使用し、キーと値のペアを持つマップは使用しないでください。ストリーム内、マップなし、キーと値のペアを使用せずにテキスト内のチャート周波数をカウントして出力する
以下のコードは好ましい結果を示します。 ループを取り除きたいmain
countLetters()
のすべての作業を行います。
明確にするには、forループやif文を使用しない機能的な方法でこれを実行したいと思います。 これはできますか?そしてもしそうなら、どうですか?
public class LetterCounter4 {
public static void main(String[] a) {
System.out.print("Input text > ");
int[] res = countLetters();
for (int i = 0; i < res.length; i++) {
if(res[i] != 0){
System.out.println((char) ('a' + i) + " appears "
+ res[i] + ((res[i] == 1 ? " time" : " times")));
}
}
}
private static int[] countLetters() {
return Arrays.stream(new Scanner(System.in).nextLine().toLowerCase()
.split(""))
.map(s -> s.charAt(0))
.filter(Character::isLetter)
.collect(Collector.of(
() -> new ArrayList<Integer>(Collections.nCopies(26, 0)),
(li, el) -> {
Integer oInt = li.get(el - 'a');
li.set(el - 'a', ++oInt);
},
(result1, result2) -> {
for (int i = 0; i < result1.size(); i++) {
Integer temp = result1.get(i);
result1.set(i, temp + result2.get(i));
}
return result1;
}))
.stream()
.mapToInt(Integer::intValue)
.toArray();
}
}
そして、それだけでなし、リストの値を印刷しますか?しかし、私はすべての値を対応する文字にリンクすることはできません。私が各ステップで印刷しているリストのインデックスを知ることができた場合を除きます。 – xtra