【问题标题】:Count all the words in a file using java Streams使用java Streams计算文件中的所有单词
【发布时间】:2019-06-03 21:29:13
【问题描述】:

我试图计算文本文件中唯一单词的数量。为了简单起见,我目前的文件内容是:

这是一个示例文件

我的尝试是:

long wordCount = 
    Files.lines(Paths.get("sample.txt"))
         .map(line -> line.split("\\s+"))
         .distinct()
         .count();
System.out.println(wordCount);

这编译并运行良好,但结果为1,而它应该是5

【问题讨论】:

标签: java java-8 java-stream word distinct-values


【解决方案1】:

您正在将每一行映射到一个数组(将Stream<String> 转换为Stream<String[]>,然后计算数组元素的数量(即文件中的行数)。

您应该使用flatMap 来创建文件中所有单词的Stream<String>,在distinct()count() 操作之后,您将获得不同单词的数量。

long wordCount = 
    Files.lines(Paths.get("sample.txt"))
         .flatMap(line -> Arrays.stream(line.split("\\s+")))
         .distinct()
         .count();

【讨论】:

  • 当您只想计算单词时,不扫描换行符可能更有效,即在 Java 9 中:new Scanner(Paths.get("sample.txt")) .findAll("\\S+") .map(MatchResult::group) .distinct() .count()。这种方法的另一个优点是它不会将空行视为单词。无论哪种情况,无论您使用Files.lines 还是Scanner.find,在生产代码中使用后都应关闭资源。
【解决方案2】:

您似乎在计算文件中的行数:

map(line -> line.split("\\s+")) // this is a Stream<String[]>

您应进一步使用Stream.flatMap作为:

long wordCount = Files.lines(Paths.get("sample.txt"))
        .map(line -> line.split("\\s+"))
        .flatMap(Arrays::stream)
        .distinct()
        .count();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-26
    • 1970-01-01
    • 2019-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-14
    相关资源
    最近更新 更多