你可以这样做.流entrySet
,然后通过对条目的值使用maxBy
来获得最大条目.因为maxBy
返回Optional
,所以您可以使用map
来获取该值.如果不存在值,则返回提示性消息.
String result = wordFreq.entrySet().stream()
.collect(Collectors.maxBy(Entry.comparingByValue()))
.map(Entry::getKey).orElse("No Value Found");
正如 comments 所说,你也可以做到这一点.出于习惯,我倾向于使用第一个词.
String result = wordFreq.entrySet().stream()
.max(Entry.comparingByValue())
.map(Entry::getKey).orElse("No Value Found");
您也可以使用其他方法来优化这一点,但因为您构建了一张 map ,所以我认为这就是您想要的方式.
如果您需要单词映射,您可能希望在方法之外构造它.然后,只需将映射传递给方法,而不是一组语句.这样你就可以把 map 用在其他地方了.
既然你还没有机会回答我的问题,我将提供一个关于领带的解决方案,使一个词出现的次数最多.与前面类似,只是首先返回找到的最大值.您可以对entrySet
进行流式处理,筛选出具有最大值的条目.然后收集成一份 list .
int max = wordFreq.entrySet().stream()
.max(Entry.comparingByValue()).map(Entry::getValue)
.orElse(0);
List<String> wordFreq.entrySet().stream()
.filter(e -> e.getValue() == max).map(Entry::getKey)
.toList();
}
最后,使用流构造来创建初始频率图.我使用\\s+
作为正则表达式,因为可能有多个空格.splitAsStream
将应用该图案,而toMap
在功能上类似于merge
.
Map<String, Integer> wordFreq = Arrays.stream(sentences)
.flatMap(s -> Pattern.compile("\\s+").splitAsStream(s))
.collect(Collectors.toMap(x -> x, x -> 1,
Integer::sum));