Научитесь писать простую программу 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}
Мы узнали, как можно использовать карту для поиска повторяющихся символов в строке, а также как проверять неповторяющиеся символы.