Как дополнительно упорядочить слова с одинаковой частотой в лексикографическом порядке?
public static void main(String[] args) {
Charset charset = Charset.forName("UTF-8");
String text =
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. " +
"Sed sodales consectetur purus at faucibus. Donec mi quam, " +
"tempor vel ipsum non, faucibus suscipit massa. Morbi lacinia " +
"velit blandit tincidunt efficitur. Vestibulum eget metus " +
"imperdiet sapien laoreet faucibus. Nunc eget vehicula mauris, " +
"ac auctor lorem. Lorem ipsum dolor sit amet, consectetur " +
"adipiscing elit. Integer vel odio nec mi tempor dignissim.";
ByteArrayInputStream textInput = new ByteArrayInputStream(text.getBytes());
System.setIn(textInput);
countOfWords(System.in, charset);
HashMap<String, Integer> result = new HashMap<>();
(new BufferedReader(new InputStreamReader(System.in)))
.lines()
.flatMap(l -> Stream.of(l.split("[\\p{Punct}\\s]+")))
.map(String::toLowerCase)
.forEach(w -> {
if (result.containsKey(w)) result.put(w, result.get(w) + 1);
else result.put(w, 1);
});
result.entrySet()
.stream()
.sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
.limit(10)
.forEach(e -> System.out.println(e.getKey()));
}
private static void countOfWords(InputStream in, Charset charset) {
}
Ответы (1 шт):
Автор решения: Podushkoved
→ Ссылка
Сортировка массива слов сначала по количеству вхождений, потом по алфавиту без учета регистра букв:
String text =
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. " +
"Sed sodales consectetur purus at faucibus. Donec mi quam, " +
"tempor vel ipsum non, faucibus suscipit massa. Morbi lacinia " +
"velit blandit tincidunt efficitur. Vestibulum eget metus " +
"imperdiet sapien laoreet faucibus. Nunc eget vehicula mauris, " +
"ac auctor lorem. Lorem ipsum dolor sit amet, consectetur " +
"adipiscing elit. Integer vel odio nec mi tempor dignissim.";
Arrays.stream(
// В исходной строке заменяем точки и запятые на пробелы
text.replace('.', ' ').replace(',', ' ')
// Разделяем строку на массив слов по пробельным символам
.split("\\s+"))
// Собираем массив слов в карту:
// ключ - слово, значение - количество вхождений
// и суммируем количество вхождений
.collect(Collectors.toMap(k -> k, v -> 1, Integer::sum))
.entrySet().stream()
// Сортировка
.sorted((e1, e2) -> {
// по количеству вхождений от большего к меньшему
int value = Objects.compare(e1.getValue(), e2.getValue(),
Comparator.reverseOrder());
if (value == 0)
// по алфавиту без учета регистра букв
value = Objects.compare(e1.getKey(), e2.getKey(),
String.CASE_INSENSITIVE_ORDER);
return value;
})
// Вывод
.forEach(System.out::println);