Как дополнительно упорядочить слова с одинаковой частотой в лексикографическом порядке?

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);
→ Ссылка