首页 > Java > java教程 > 如何使用 Java 8 的 Stream API 有效地统计列表中的词频?

如何使用 Java 8 的 Stream API 有效地统计列表中的词频?

Susan Sarandon
发布: 2024-11-03 14:51:02
原创
996 人浏览过

How can Java 8's Stream API be used to efficiently count word frequencies in a list?

Java 8 实现词频计数

识别给定列表中单词的频率是自然语言处理中的一项基本任务。 Java 8 提供了一种通用方法,可以使用其强大的流 API 和内置收集器来有效地计算单词的出现次数。

问题:

考虑以下单词列表:

<code class="java">List<String> wordsList = Lists.newArrayList("hello", "bye", "ciao", "bye", "ciao");</code>
登录后复制

目标是确定每个单词的频率计数,从而产生输出比如:

<code class="java">{ciao=2, hello=1, bye=2}</code>
登录后复制

Java 8 解决方案:

与传统方法不同,Java 8 采用了不同的方法:

<code class="java">Map<String, Long> collect = wordsList.stream()
    .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));</code>
登录后复制

这一行在代码中,stream()方法用于启动wordsList中的元素流。随后,Collectors.groupingBy() 根据元素的身份(单词本身)收集元素,Collectors.counting() 计算每个出现的频率。

对于整数,可以稍微修改代码:

<code class="java">Map<String, Integer> collect = wordsList.stream()
     .collect(Collectors.groupingBy(Function.identity(), Collectors.summingInt(e -> 1)));</code>
登录后复制

按值排序:

此外,生成的地图可以按词频降序排序:

<code class="java">LinkedHashMap<String, Long> countByWordSorted = collect.entrySet()
            .stream()
            .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
            .collect(Collectors.toMap(
                    Map.Entry::getKey,
                    Map.Entry::getValue,
                    (v1, v2) -> {
                        throw new IllegalStateException();
                    },
                    LinkedHashMap::new
            ));</code>
登录后复制

这个额外的代码片段将一个条目集追加到流中,根据值按降序排序,并将条目收集到 LinkedHashMap 中以维护排序的顺序。

以上是如何使用 Java 8 的 Stream API 有效地统计列表中的词频?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板