我想从大文件内容中找到重复的字数。有没有使用java 8流API的最佳方法?
更新详情
文件格式为逗号分隔值,文件大小约为4 GB
答案 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();