Почему метод не срабатывает корректно?
Почему-то на платформе Stepik не проходит метод. Пишет, что провален тест. Не пойму, что не так делаю? Подскажите, пожалуйста.
Условие задачи:
Напишите программу, читающую из System.in текст в кодировке UTF-8, подсчитывающую в нем частоту появления слов, и в конце выводящую 10 наиболее часто встречающихся слов.
Словом будем считать любую непрерывную последовательность символов, состоящую только из букв и цифр. Например, в строке "Мама мыла раму 33 раза!" ровно пять слов: "Мама", "мыла", "раму", "33" и "раза".
Подсчет слов должен выполняться без учета регистра, т.е. "МАМА", "мама" и "Мама" — это одно и то же слово. Выводите слова в нижнем регистре.
Если в тексте меньше 10 уникальных слов, то выводите сколько есть.
Если в тексте некоторые слова имеют одинаковую частоту, т.е. их нельзя однозначно упорядочить только по частоте, то дополнительно упорядочите слова с одинаковой частотой в лексикографическом порядке.
Задача имеет красивое решение через стримы без циклов и условных операторов. Попробуйте придумать его.
public static void main(String[] args) {
HashMap<String, Integer> result = new HashMap<>();
(new BufferedReader(new InputStreamReader(System.in, StandardCharsets.UTF_8)))
.lines()
.flatMap(l -> Stream.of(l.split("[\\p{Punct}\\s]+")))
.map(w -> w.toLowerCase())
.forEach(w -> {
if (result.containsKey(w)) {
result.put(w, result.get(w) + 1);
} else {
result.put(w, 1);
}
});
result.entrySet()
.stream()
.sorted((e1, e2) -> {
if (e1.getValue() == e2.getValue()) {
return e1.getKey().compareTo(e2.getKey());
} else {
return e2.getValue().compareTo(e1.getValue());
}
})
.limit(10)
.forEach(e -> System.out.println(e.getKey()));
}
Ответы (1 шт):
Вот более изящная версия:
public static void main(String[] args) throws IOException
{
try (Stream<String> lines = Files
.lines(Paths.get("freq.txt")))
{
lines
.flatMap(l -> Stream.of(l.split("[\\p{Punct}\\s]+")))
.collect(Collectors.groupingBy(String::toLowerCase, Collectors.counting()))
.entrySet()
.stream()
.sorted((e1, e2) ->
{
if (e1.getValue().equals(e2.getValue()))
{
return e1.getKey().compareTo(e2.getKey());
} else
{
return e2.getValue().compareTo(e1.getValue());
}
})
.limit(10)
.forEach(e -> System.out.println(e.getKey()));
}
}
Может, она подойдет