gpt4 book ai didi

java - 使用流、无映射、无键值对计算和打印文本中的字符频率

转载 作者:行者123 更新时间:2023-12-02 11:49:34 24 4
gpt4 key购买 nike

我正在尝试计算并打印文本中所有字符的频率。我想使用Array来做到这一点或ArrayList并且没有带有键值对的映射。

下面的代码给出了首选结果。我想摆脱 for 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();
}
}

最佳答案

最简单的方法是使用.groupingBy(c -> c, Collectors.counting())。代码会更简单,并且当有人输入 À 或 [a-zA-Z] 范围之外的其他字母时不会崩溃。但这会创建一个 Map,您说您不想要它。

如果您特别希望坚持使用数组和列表,可以使用以下方法:

public static void main(String[] args) {
String input = new Scanner(System.in).nextLine();

int[] counts = countLetters(input);

IntStream.range(0, counts.length)
.filter(i -> counts[i] > 0)
.forEachOrdered(i -> System.out.printf("%c appears %s %s%n",
'a' + i,
counts[i],
counts[i] > 1 ? "times" : "time"
));
}

public static int[] countLetters(String s) {
return s.chars() // this is better than stream(split(""))
.filter(Character::isLetter) // WRONG to assume that all letters are [a-zA-Z]
.map(chr -> Character.toLowerCase(chr) - 'a')
.collect(
() -> new int[26],
(ary, i) -> ary[i]++,
(a,b) -> Arrays.setAll(a, i -> a[i] + b[i])
);
}

关于java - 使用流、无映射、无键值对计算和打印文本中的字符频率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47978316/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com