Как можно оптимизировать (используя лямбда-выражения или stream API) код ниже изложенный, имея следующие условия задания?
Реализовать метод, который принимает путь к файлу. Метод возвращает частоту повторяемости всех слов в тексте в порядке возрастания частоты повторяемости.
public Map<String, Integer> getCountOfWordsCharFrequency(String way) {
Map<String, Integer> map = new HashMap<>();
List<String> list = getListStringFromFile(way);
Integer value;
for (String stringOfWord : list) {
String[] text = stringOfWord.split(" ");
for (String word : text) {
value = map.get(word);
if (value == null) {
map.put(word.toLowerCase(), 1);
} else {
map.put(word.toLowerCase(), value + 1);
}
}
}
return map
.entrySet()
.stream()
.sorted(Map.Entry.comparingByValue())
.collect(Collectors
.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));
}
Ответы (1 шт):
Достаточно использовать поток строк, который возвращается при помощи Files.lines вместо вызова некоего метода getListStringFromFile,возвращающего коллекцию (список) строк.
Также понадобится применить Stream::flatMap после применения String.split, как примерно показано здесь:
public Map<String, Integer> getWordFrequencies(String path) throws IOException {
try (Stream<String> input = Files.lines(Paths.get(path))) {
return input
.flatMap(str -> Arrays.stream(str.split("\\P{L}+"))) // поток слов
.collect(Collectors.groupingBy(
word -> word,
Collectors.summingInt(word -> 1)
)) // Map<String, Integer>
.entrySet()
.stream()
.sorted(Map.Entry.comparingByValue())
.collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue,
(v1, v2) -> v1,
LinkedHashMap::new
));
}
}
В данном ответе на вопрос Нужно подсчитать сколько раз каждое слово встречается в тексте. Некоторые (меньшая часть) слова подсчитываются неверно. показан пример более точного разбиения на слова при помощи регулярного выражения \P{L}+, а также дополнительной фильтрации слов по длине и частоте вхождения, и улучшенной сортировки слов по убыванию частоты и в алфавитном порядке при совпадении частот.