Подсчитать все слова в файле, используя потоки Java - PullRequest
0 голосов
/ 09 января 2019

Я пытался посчитать количество уникальных слов в текстовом файле. Для простоты, мой текущий файл:

Это образец файла

Моя попытка:

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

Это компилируется и работает нормально, но приводит к 1, тогда как должно быть 5.

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Вы, кажется, вместо этого считаете строки в вашем файле:

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();
0 голосов
/ 09 января 2019

Вы отображаете каждую строку в массив (преобразует 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();
...