Java: вывести слова из текста в алфавитном порядке

211
02 ноября 2021, 00:50

Есть массив со словами, как вывести слова в массиве по алфавиту и посчитать сколько одинаковых слов, например:

String[] words = {"a", "a", "at", "but", "down", "he", "wolf", "wolf"};

Возможно ли вывести массив через циклы или надо писать кучу if? У меня получилось так:

private void sortWords() {
    String[] words = {"a", "a", "at", "but", "down", "he", "wolf", "wolf"};
    char q;
    for (int i = 0; i < words.length; i++) {
        for (char j = 'a'; j <= 'z'; j++) {
            q = words[i].charAt(0);
            if (q == j) {
                System.out.println(j + ": " + words[i] + " - " + (i + 1));
            }
        }
    }
}

Answer 1

Вариант с использованием TreeMap и stream api:

String[] words = {"a", "a", "at", "but", "down", "he", "wolf", "wolf"};
TreeMap<String, Integer> wordsQuantity = new TreeMap<>();
Arrays.stream(words).forEach(word -> {
    int quantity = wordsQuantity.getOrDefault(word, 0);
    wordsQuantity.put(word, quantity + 1);
});
System.out.println(wordsQuantity); // {a=2, at=1, but=1, down=1, he=1, wolf=2}

В данном случае порядок слов определяется компаратором по умолчанию natural ordering, т.е. по алфавиту, а чтоб совсем как в задаче было, можно еще один stream добавить:

wordsQuantity.forEach((word, quantity) ->
            System.out.println(word.charAt(0) + ": " + word + " - " + quantity));
// a: a - 2
// a: at - 1
// b: but - 1
// d: down - 1
// h: he - 1
// w: wolf - 2

UPD: Немного допилил (спасибо @And) - можно одним stream обойтись, и работает быстрее:

String[] words = {"a", "a", "at", "but", "down", "he", "wolf", "wolf"};
Arrays.stream(words)
    .collect(Collectors.groupingBy(e -> e, TreeMap::new, Collectors.counting()))
    .forEach((word, quantity) ->
        System.out.println(word.charAt(0) + ": " + word + " - " + quantity));
// a: a - 2
// a: at - 1
// b: but - 1
// d: down - 1
// h: he - 1
// w: wolf - 2
Answer 2
String[] words = {"a", "a", "at", "but", "down", "he", "wolf", "wolf"};
Arrays.stream(words)
.collect(Collectors.groupingBy(e -> e, Collectors.counting()))
.entrySet()
.stream()
.sorted(Map.Entry.comparingByKey())
.forEachOrdered(action -> {
    String name = action.getKey();
    System.out.println(name.charAt(0) + ": " + name + " - " + action.getValue());
});

Вывод:

a: a - 2
a: at - 1
b: but - 1
d: down - 1
h: he - 1
w: wolf - 2
READ ALSO
Ошибка инициализации MySQL 8.0

Ошибка инициализации MySQL 8.0

Помогите, пожалуйста, запустить mySql 80 Файл my

186
Как сделать чтобы подзапрос с агрегацией отрабатывал построчно для группировки?

Как сделать чтобы подзапрос с агрегацией отрабатывал построчно для группировки?

Есть таблица постов post от пользователей такого вида:

92
Амперсанд в регулярном выражении mysql?

Амперсанд в регулярном выражении mysql?

Подскажите как заставить работать следующий запрос:

156
Сохранение данных в приложении андроид

Сохранение данных в приложении андроид

Есть приложение с БД MySQL (пользователь из интерфейса приложения БД изменять не может, только читать данные из нее), кроме того, некоторые настройки...

198