попробуйте это:
String fileName = "file.txt";
try {
Map<String, Long> wordCount = Files.lines(Path.of(fileName))
.flatMap(line -> Arrays.stream(line.split("\\s+")))
.filter(w->w.matches("[a-zA-Z]+"))
.sorted(Comparator.comparing(String::length)
.thenComparing(String.CASE_INSENSITIVE_ORDER))
.collect(Collectors.groupingBy(w -> w,
LinkedHashMap::new, Collectors.counting()));
wordCount.entrySet().forEach(System.out::println);
}catch (Exception e) {
e.printStackTrace();
}
Это относительно просто. Он просто разбивается на пустое пространство и подсчитывает слова, помещая их в карту, где ключ - это слово, а значение - это длинная строка, содержащая счет. , Это работает так, что Lines
помещается в поток. Затем каждая строка разбивается на слова, используя String.split
. Поскольку это создает массив, flatMap
преобразует все эти отдельные потоки слов в один поток, где они обрабатываются. Рабочей лошадкой этого является Collectors.groupingBy
, который группирует значения определенным образом для каждой клавиши. В этом случае я указывал метод Collectors.counting()
для увеличения счетчика каждый раз, когда появлялся ключ (т. Е. Слово).
В качестве опции я сортировал слова сначала по длине, а затем по алфавиту, игнорируя регистр.