2017-02-18 12 views
2

Я хочу найти количество повторных слов из большого содержимого файла. Есть ли лучший подход, использующий API-интерфейс java 8 stream?Java - многократное количество слов в большом файле

Обновленный Подробнее

Формат файла, разделенные запятыми значения и размер файла составляет около 4 ГБ

+1

Какой формат файла? И повторное количество слов, это просто для каждого слова во вводе, количество вхождений? Или…? –

ответ

1

Если у вас уже есть список всех слов, скажем List<String> words, то вы можете использовать что-то вроде:

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

Я не знаю, есть ли лучший подход, и это также будет зависеть от деталей, которые вы нам не сказали. На данный момент я принимаю текстовый файл с несколькими словами, разделенными пробелами в каждой строке. Возможным подходом было бы следующее:

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

Я думаю, что расщепление каждой строки на слова необходимо уточнить; вы, вероятно, захотите отменить пунктуацию, например. Возьмите это как отправную точку и превратите ее в то, что вам нужно в вашей конкретной ситуации.

Edit: с благодарностью @ 4castle для вдохновения, разбиение на слова может быть сделано таким образом вас предпочитают эталонный метод над лямбда:

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

Он производит то же самое. Edit2: глупость об оптимизации удалена здесь.

Возможно, нам не стоит заходить слишком далеко, пока мы не узнаем более точное требование для разграничения слов в каждой строке.

+2

Для начала split может быть '.flatMap (Pattern.compile (" ") :: splitAsStream)' – 4castle