所以我有以下数组作为输入
String[] input = new String[] {
"This is a sample string",
" string ", // additional spaces here cause issues while splitting
"Another sample string",
"This is not a sample string"
};
需要统计单个单词的频率。所需的输出是:
{a=2, not=1, string=4, This=2, is=2, sample=3, Another=1}
到目前为止,我得到了一些工作代码:
// 1. Convert String[] into a single " " delimited String
String joined = String.join(" ", input);
// 2. Split on " " and then calculate count using Collectors.groupingBy
Map <String, Long> output = Arrays.stream(joined.split(" "))
.filter(s -> !s.equals("")) // To Deal with Empty Strings
.collect(Collectors.groupingBy(Function.identity(),Collectors.counting()));
System.out.println(output);
这对我来说看起来非常粗糙,请建议使用 Streams API 更好的方法来做到这一点。 谢谢你。
您的代码看起来基本正确,进行一些更改即可使其工作。使用
String.split("\\s+")
可以按任何空白字符序列进行拆分,而不是按空格 joined.split(" ")
进行拆分。使用当前代码,任何区分大小写的单词都将被视为两个不同的单词,例如 Sample
和 sample
Map<String, Long> output = Arrays.stream(joined.split("\\s+"))
.map(String::toLowerCase) // For case-insensitivity conversion if needed
.filter(s -> !s.isEmpty()) // Filter out empty strings
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));