Удаление повторов символов из строки

216
31 марта 2017, 22:50

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

Пример. Вход - "у попа была собака", выход - "у поа был ск".

Answer 1

Первый вариант на основе этого ответа:

String str = "Упопабыласобака";
String result = new StringBuilder(str).reverse().toString();
result = result.replaceAll("(.)(?=.*\\1)", "");
result = new StringBuilder(result).reverse().toString();
System.out.println(result);

Вывод на экран:

Упоабылск

Замена replaceAll("(.)(?=.*\\1)", "") приводит к сохранению только последнего вхождения символа в строку, поэтому приходится разворачивать строку перед заменой и, соответственно, после замены.

Второй вариант без разворота строки, но с пометкой "не повторяйте этого дома", на основе этого ответа:

String str = "Упопабыласобака";
String pattern = "(.)(?=(.*))(?<=(?=\\1.*?\\1\\2$).+)";
String result = str.replaceAll(pattern, "");
System.out.println(result);

Вывод на экран аналогичен.

Третий вариант без использования рег. выражений (для полноты картины и для сравнения производительности) с использованием HashSet:

String str = "Упопабыласобака";
Set<Character> set = new HashSet<>();
StringBuilder sb = new StringBuilder();
for (char c : str.toCharArray())
{
    if (!set.contains(c))
    {
        set.add(c);
        sb.append(c);
    }
}
String result = sb.toString();

Тест на строке из 10k символов (код генерации строки можно посмотреть здесь):

1:  220мс
2: 1250мс
3:    2мс

Тест на строке из 100к символов:

1:  19000мс
2: >60000мс
3:      5мс
READ ALSO
Как вызвать заставку Windows и поменять цвет?

Как вызвать заставку Windows и поменять цвет?

Задача, через Java поменять цвет монитора на конкретно заданныйДопустим, красный

220
Криптография общения клиент-сервера

Криптография общения клиент-сервера

Недавно передо мной была поставлена задача:

244
Java. Отслеживание событий

Java. Отслеживание событий

Есть какие-нибудь инструменты для Java, чтобы отслеживать события, которые произошли в приложении (нажатие кнопки, выбор элемента в JList, закрытие...

293
Как изменять переменную в функции при каждой итерации цикла

Как изменять переменную в функции при каждой итерации цикла

Нужно чтобы при каждой итерации цикла в формулах a и b менялся первый элемент с Aget(0) и A

227