Java – Поиск повторяющихся символов в строке

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

Мы можем использовать данный код для поиска повторяющихся символов или изменить код для поиска неповторяющихся символов в строке.

1. Использование простого Java

Давайте начнем с написания логики программы самостоятельно. В этом решении мы создаем Map, где каждый уникальный символ в строке является ключом Map, а количество вхождений символа сохраняется как значение.

1.1 Алгоритм

  • Разбить строку на массив символов.
  • Выполнить итерацию по массиву символов.
  • Для каждой итерации используйте символ в качестве ключа карты и проверяйте, присутствует ли этот же символ в карте.
  • Если ключ карты не существует, персонаж встречается впервые. Сохраните его на карте со значением счетчика 1.
  • Если ключ карты существует, увеличьте соответствующий счетчик.
  • Повторяйте, пока не будут перебраны все символы в массиве.
  • Проверьте карту. Количество повторяющихся символов превышает 1.
  • Отдельные символы будут учитываться как 1.

1.2 Программа Java

public static Map<Character, Integer> getCharBag(String input) {Map<Character, Integer> map = new HashMap<>();if(input == null || input.isEmpty())return map;for(char c : input.toCharArray()) {map.compute(c,(key, value) ->(value == null) ? 1 : value + 1);}return map;}

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

//duplicate charsList duplicateChars = bag.keySet().stream().filter(k -> bag.get(k) > 1).collect(Collectors.toList());System.out.println(duplicateChars); //[a, o]

Мы также можем найти повторяющиеся символы и количество их появлений в этой строке.

Map<Character, Integer> duplicateCharsWithCount = bag.entrySet().stream().filter(e -> bag.get(e.getKey()) > 1).collect(Collectors.toMap(p -> p.getKey(), p -> p.getValue()));System.out.println(duplicateCharsWithCount); //{a=2, o=3}

Аналогично мы можем получить все уникальные символы, сравнив количество с 1.

//unique charsList duplicateChars = bag.keySet().stream().filter(k -> bag.get(k) == 1).collect(Collectors.toList());System.out.println(duplicateChars); //[t, d, v, w, h, i, j, n]

2. Использование Google Guava

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

<dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>31.1-jre</version></dependency>

Нам нужно добавить все символы в Multiset по одному. Класс Multiset позволяет хранить несколько вхождений одного и того же элемента, отслеживая количество каждого уникального элемента, который он содержит.

Multiset multiset = HashMultiset.create();for(char c : input.toCharArray()) {multiset.add(c);}

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

Map<Character, Integer> duplicateCharsWithCount =(Map<Character, Integer>) multiset.elementSet().stream().filter(k -> multiset.count(k) > 1).collect(Collectors.toMap(p -> p, p -> multiset.count(p)));System.out.println(duplicateCharsWithCount); //{a=2, o=3}

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

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

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