当前位置: 首页 > 面试题库 >

Java 8的字数统计

蓟辰沛
2023-03-14
问题内容

我正在尝试在Java 8中实现单词计数程序,但无法使其工作。该方法必须将字符串作为参数并返回Map<String,Integer>

当我以旧的Java方式进行操作时,一切正常。但是,当我尝试在Java 8中执行此操作时,它将返回一个映射,其中键为空且具有正确的出现次数。

这是我的Java 8风格的代码:

public Map<String, Integer> countJava8(String input){
       return Pattern.compile("(\\w+)").splitAsStream(input).collect(Collectors.groupingBy(e -> e.toLowerCase(), Collectors.reducing(0, e -> 1, Integer::sum)));
    }

这是我在正常情况下会使用的代码:

public Map<String, Integer> count(String input){
        Map<String, Integer> wordcount = new HashMap<>();
        Pattern compile = Pattern.compile("(\\w+)");
        Matcher matcher = compile.matcher(input);

        while(matcher.find()){
            String word = matcher.group().toLowerCase();
            if(wordcount.containsKey(word)){
                Integer count = wordcount.get(word);
                wordcount.put(word, ++count);
            } else {
                wordcount.put(word.toLowerCase(), 1);
            }
        }
        return wordcount;
 }

主程序:

public static void main(String[] args) {
       WordCount wordCount = new WordCount();
       Map<String, Integer> phrase = wordCount.countJava8("one fish two fish red fish blue fish");
       Map<String, Integer> count = wordCount.count("one fish two fish red fish blue fish");

        System.out.println(phrase);
        System.out.println();
        System.out.println(count);
    }

当我运行该程序时,输出如下:

{ =7, =1}
{red=1, blue=1, one=1, fish=4, two=1}

我认为该方法splitAsStream会将正则表达式中的匹配元素流式传输为Stream。我该如何纠正?


问题答案:

问题似乎在于您实际上是按单词 拆分的 ,也就是说,您正在流过 不是 单词或单词 之间的所有内容
。不幸的是,似乎没有等效的方法来传输实际的比赛结果(难以置信,但我没有找到任何方法;如果您知道,请随时发表评论)。

取而代之的是,您可以使用\W而不是非单词进行拆分\w。此外,如在评论中指出,你可以把它 有点
更通过可读String::toLowerCase,而不是一个拉姆达和Collectors.summingInt

public static Map<String, Integer> countJava8(String input) {
    return Pattern.compile("\\W+")
                  .splitAsStream(input)
                  .collect(Collectors.groupingBy(String::toLowerCase,
                                                 Collectors.summingInt(s -> 1)));
}

但是恕我直言,这仍然很难理解,这不仅是因为“反向”查找,而且很难将其推广到其他更复杂的模式。就我个人而言,我只是采用“老派”解决方案,也许可以使用新解决方案使它更紧凑getOrDefault

public static Map<String, Integer> countOldschool(String input) {
    Map<String, Integer> wordcount = new HashMap<>();
    Matcher matcher = Pattern.compile("\\w+").matcher(input);
    while (matcher.find()) {
        String word = matcher.group().toLowerCase();
        wordcount.put(word, wordcount.getOrDefault(word, 0) + 1);
    }
    return wordcount;
}

在两种情况下结果似乎都是相同的。



 类似资料:
  • 本文向大家介绍Java8进行多个字段分组统计的实例代码,包括了Java8进行多个字段分组统计的实例代码的使用技巧和注意事项,需要的朋友参考一下 Java8进行多个字段分组统计实现代码如下: 实例补充: 1.本实例其实可以用一句简单的sql去实现 由于我们项目数据库中时间存的是13位的时间戳 所以必须得转行成日期格式 才能进行分组 如下: 以上的就能实现多字段求和统计等功能 但我们老大考虑到查询速度

  • (待翻译)

  • 问题内容: 想知道有没有比如下计算给定字符串的字符数更简单的方法? 问题答案: 具有完全的Unicode支持(Java 11+)1的最简单的方法来计算字符串中每个字符的出现次数: 1)答案的结尾是具有完整Unicode支持的Java 8版本。 输出量 更新: 对于Java 8+(不支持补充平面中的字符,例如emoji): 更新2: 同样适用于Java 8+。 我误会了,以为它是在Java 9之前才

  • 展示字段数据统计 通过 Fields 列表, 您可以看到文档列表里面有多少文档包含特定的字段,这个字段排名前5的值是什么,包含每一个值的文档所占的百分比是多少。 在字段列表里面点击字段名称,可以展示字段数据统计。

  • 问题内容: 我最近一直在研究一些数据库搜索功能,希望获得一些信息,例如每个文档的平均单词数(例如数据库中的文本字段)。到目前为止,我发现的唯一内容(没有在DB外部进行选择的语言处理)是: 这似乎可行*,但您还有其他建议吗?我目前使用的是MySQL 4(希望很快将其迁移至该应用程序的版本5),但也对通用解决方案感兴趣。 谢谢! *我可以想象这是确定它的一种相当粗糙的方法,因为它也没有考虑内容等中的H

  • 我的项目已经开始使用java 8从java 7。 在切换到Java8之后,我们看到了一些问题,比如随着时间的推移,内存消耗越来越高。 以下是我们所做的调查: 只有从java7和java8迁移后才会出现问题 因为metaspace是唯一与内存相关的东西,从hava 7到java 8。我们监控metaspace,它不会增长超过20 MB。 堆也保持一致。 现在剩下的唯一路径是分析内存如何在java7和