Найти повторяющиеся слова в строке на Java

Поиск дубликатов или повторяющихся слов в строке Java — очень распространенный вопрос на собеседовании. Мы можем найти все дубликаты слов, используя различные методы, такие как коллекции и потоки Java 8.

1. Проблема

Предположим, у нас есть строка с именами. Мы хотим подсчитать, какие имена встречаются более одного раза. Мы также можем захотеть подсчитать вхождения таких дублирующих слов, а также всех слов.

String sentence = "alex brian charles alex charles david eric david";

Приведенная выше строка содержит 3 повторяющихся слова, которые встречаются дважды, и два уникальных слова.

alex=2charles=2david=2brian=1eric=1

2. Найдите повторяющиеся слова с помощью Stream

Java Stream API предоставляет несколько полезных методов для итерации по коллекциям, выполнения промежуточных операций и сбора соответствующих элементов в новые коллекции.

  • В данной программе Java мы выполняем следующие шаги:
  • Разделите строку пробелами, чтобы получить все слова в String[]
  • Преобразовать String[] в список, содержащий все слова
  • Перебрать список с помощью Stream и найти повторяющиеся слова

Чтобы определить, что слово является дубликатом, мы поддерживаем HashSet. Если метод Set.add() возвращает false, это означает, что слово уже присутствует в наборе и, следовательно, является дубликатом.

List<String> wordsList = Arrays.stream(sentence.split(" ")).collect(Collectors.toList());Set<String> tempSet = new HashSet<>();List<String> duplicateWords = wordsList.stream().filter(w -> !tempSet.add(w)).collect(Collectors.toList());System.out.println(duplicateWords); 

Вывод программы.

[alex, charles, david]

Предположим, мы хотим подсчитать количество вхождений каждого слова в предложении, тогда мы можем собрать слова с помощью toMap() и подсчитать количество вхождений с помощью Math::addExact.

List<String> wordsList = Arrays.stream(sentence.split(" ")).collect(Collectors.toList());Map<String, Integer> wordsMapWithCount = wordsList.stream().collect(Collectors.toMap(Function.identity(), word -> 1, Math::addExact));System.out.println(wordsMapWithCount);

Вывод программы.

{alex=2, eric=1, charles=2, david=2, brian=1}

Если мы хотим найти только повторяющиеся слова и количество их вхождений, то мы можем отфильтровать(filter()) приведенную выше карту следующим образом:

Map<String, Integer> dupWordsMapWithCount = wordsMapWithCount.entrySet().stream().filter(e -> e.getValue() > 1).collect(Collectors.toMap(Entry::getKey, Entry::getValue));System.out.println(dupWordsMapWithCount);

Вывод программы.

{alex=2, charles=2, david=2}

3. Найдите повторяющиеся слова с помощью коллекций

В целом процесс поиска дубликатов с использованием коллекций аналогичен предыдущему подходу.

Мы начинаем с разбиения строки и сбора всех слов в списке. Затем мы используем метод HashSet.add(), чтобы проверить, является ли слово уникальным или дубликатом.

List<String> wordsList = Arrays.asList(sentence.split(" "));Set<String> tempSet = new HashSet<>();List<String> duplicateWords = new ArrayList<>();for(String word : wordsList) {if(!tempSet.add(word)) {duplicateWords.add(word);}}System.out.println(duplicateWords);

Вывод программы.

[alex, charles, david]

Если нам нужно найти повторяющиеся слова вместе с количеством их появлений в строке, мы можем использовать API Collections.frequency(list, item), который подсчитывает количество появлений элемента в указанном списке.

Map<String, Integer> dupWordsMapWithCount = new HashMap<>();for(String word : duplicateWords) {dupWordsMapWithCount.put(word, Collections.frequency(wordsList, word));}System.out.println(dupWordsMapWithCount);

Вывод программы.

{alex=2, charles=2, david=2}

4. Заключение

В этом уроке Java мы обсудили два подхода к поиску всех повторяющихся слов в строке и сколько раз они встречаются в этой строке. Эти программы Java можно использовать и для поиска уникальных слов в строке.

Исходный код на Github

Прокрутить вверх