gpt4 book ai didi

Java 8 Stream 确定文本文件中的最大计数

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:52:33 25 4
gpt4 key购买 nike

对于我的作业,我必须将 for 循环替换为计算文本文档中单词出现频率的流,而且我无法弄清楚 TODO 部分。

String filename = "SophieSallyJack.txt";
if (args.length == 1) {
filename = args[0];
}
Map<String, Integer> wordFrequency = new TreeMap<>();

List<String> incoming = Utilities.readAFile(filename);

wordFrequency = incoming.stream()
.map(String::toLowerCase)
.filter(word -> !word.trim().isEmpty())
.collect(Collectors.toMap(word -> word, word -> 1, (a, b) -> a + b, TreeMap::new));

int maxCnt = 0;

// TODO add a single statement that uses streams to determine maxCnt
for (String word : incoming) {
Integer cnt = wordFrequency.get(word);
if (cnt != null) {
if (cnt > maxCnt) {
maxCnt = cnt;
}
}
}
System.out.print("Words that appear " + maxCnt + " times:");

我试过这个:

wordFrequency = incoming.parallelStream().
collect(Collectors.toConcurrentMap(w -> w, w -> 1, Integer::sum));

但这是不对的,我不确定如何将 maxCnt 合并到流中。

最佳答案

假设您从 List<String> 中的文件中提取了所有单词可以使用这种方法计算每个单词的字数,

Map<String, Long> wordToCountMap = words.stream()
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));

然后可以使用上面的 map 计算最频繁出现的单词像这样,

Entry<String, Long> mostFreequentWord = wordToCountMap.entrySet().stream()
.max(Map.Entry.comparingByValue())
.orElse(new AbstractMap.SimpleEntry<>("Invalid", 0l));

如果你愿意,你可以一起改变上面的两个管道,

Entry<String, Long> mostFreequentWord = words.stream()
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
.entrySet().stream()
.max(Map.Entry.comparingByValue())
.orElse(new AbstractMap.SimpleEntry<>("Invalid", 0l));

更新

根据以下讨论,返回 Optional 总是好的从你这样的计算,

Optional<Entry<String, Long>> mostFreequentWord = words.stream()
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
.entrySet().stream()
.max(Map.Entry.comparingByValue());

关于Java 8 Stream 确定文本文件中的最大计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52829238/

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