Java - 大文件中重复的字数

时间:2017-02-18 01:07:54

标签: java java-8 java-stream

我想从大文件内容中找到重复的字数。有没有使用java 8流API的最佳方法?

更新详情

文件格式为逗号分隔值,文件大小约为4 GB

3 个答案:

答案 0 :(得分:5)

我不知道是否有最好的方法,而且还取决于你没有告诉我们的细节。现在我假设一个文本文件,每行包含多个以空格分隔的单词。可能的方法是:

    Map<String, Long> result = Files.lines(filePath)
            .flatMap(line -> Stream.of(line.split(" ")))
            .collect(Collectors.groupingBy(word -> word, Collectors.counting()));

我认为将每一行分成单词需要加以改进;例如,你可能想要丢弃标点符号。以此为出发点,将其发展为您在特定情况下的需求。

编辑:感谢@ 4castle的灵感,可以通过这种方式分割成单词,而不是基于lambda的方法引用:

    Map<String, Long> result = Files.lines(filePath)
            .flatMap(Pattern.compile(" ")::splitAsStream)
            .collect(Collectors.groupingBy(word -> word, Collectors.counting()));

它产生相同的。 Edit2:这里删除了关于优化的废话。

也许我们不应该走得太远,直到我们知道在每一行中划分单词的更准确的要求。

答案 1 :(得分:1)

如果您已经拥有所有单词的列表,请说List<String> words,那么您可以使用以下内容:

 Map<String, Integer> counts = words.parallelStream().
            collect(Collectors.toConcurrentMap(
                w -> w, w -> 1, Integer::sum));

答案 2 :(得分:0)

您可以用不同的方式执行相同的操作,只需计算文件中的单词数(所有单词,包括重复单词)。然后使用流将所有单词简单地添加到集合(不允许重复值)中。然后执行总字数-集合的大小。这样一来,您就可以轻松获得所有重复的字数。

Long totalWordCount = Files.lines(filePath)
                  .flatMap(line -> Stream.of(line.split(" "))).count();

Set<String> uniqueWords = Files.lines(filePath)
                      .flatMap(line -> Stream.of(line.split(" ")))
                      .collect(Collectors.toSet());

Long repetitiveWordCount = totalWordCount - (long) uniqueWords.size();