Избранное сообщение

Фетісов В. С. Комп’ютерні технології в тестуванні. Навчально-методичний посібник. 2-ге видання, перероблене та доповнене / Мои публикации

В 10-х годах я принимал участие в программе Европейского Союза Tempus "Освітні вимірювання, адаптовані до стандартів ЄС". В рамк...

Благодаря Интернету количество писателей и поэтов увеличивается в геометрической прогрессии. Поголовье читателей начинает заметно отставать.

среда, 15 июня 2016 г.

Как убрать повторяющиеся символы из строки в java / Программирование на Java

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

Удаление повторяющихся символов из строки. Теория

Сегодня мы реализуем интересный метод, который принимают на вход строку, например, «jjjj», а на выходе выдает «j». Для этого мы не будет использовать сторонние библиотеки, а сделаем все на чистой Java.
Алгоритм удаления повторяющихся символом в строке мы реализуем в методе deleteDuplicates (String input), который принимает в качестве параметра строку с дублями и возвращает новую строку без дублей.
Суть алгоритма сводится к тому, что мы проходим по каждому символу строки и проверяем, не является ли он дубликатом уже найденного символа. Если он таким является, то вместо него вставляем 0. Так продолжается, пока мы не пройдем в цикле всю строку до конца. После цикла вызывается метод, который создает строку из массива символов, пропуская символы с нулями. Этот метод будет работать даже если входная строка содержит более одного повторяющегося символа. Такой алгоритм является brute force алгоритмом (т.н. полный перебор или метод «грубой силы»).

Как убрать повторяющиеся символы из строки. Практика

Ниже представлен метод удаления символов-дублей из входной строки:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
public class DeleteDuplicates {
    public static void main(String[] args) {
        String[] inputStrings = {"jjjaavva", "jar", "android", "", "qwertyqwerty", "jajavava"};

        for (String input : inputStrings) {
            System.out.println(input + " - " + replaceDuplicatesWithTemplate(input));
        }
    }

    // удаляем дубликаты из входной строки
    public static String replaceDuplicatesWithTemplate(String inputString) {
        // проверяем входну строку на валидность
        if (inputString == null || inputString.length() < 2) {
            return inputString;
        }
        // возможная позиция дублирующего символа
        int position = 1;
        char[] characters = inputString.toCharArray();
        for (int i = 1; i < inputString.length(); i++) {
            int j;
            // находим уже пройденную позицию
            for (j = 0; j < position; ++j) {
                if (characters[i] == characters[j]) {
                    break;
                }
            }
            // если это символ в этой же позиции, то идем к следующему символу
            if (j == position) {
                characters[position] = characters[i];
                ++position;
                // иначе заменяем его на шаблон 0 и переходим к следующему символу
            } else {
                characters[position] = 0;
                ++position;
            }
        }
        return getStringWithoutDuplicates(characters);
    }

    public static String getStringWithoutDuplicates(char[] inputChars) {
        StringBuilder stringBuilder = new StringBuilder(inputChars.length);
        for (char character : inputChars) {
            // если символ не равен шаблону 0, то это не дубль,
            // значит сохраняем его
            if (character != 0) {
                stringBuilder.append(character);
            }
        }
        return stringBuilder.toString();
    }
}
Обратите внимание, что здесь можно обойтись и без переменной position, но для наглядности решил оставить.
Теперь запустим и посмотрим, что получилось:
jjjaavva - jav
jar - jar
android - androi
-
qwertyqwerty - qwerty
jajavava - jav
Как видим, пустую строку метод вернул без изменений, так как ее длина меньше 2.
Вот такой простой способ проверки слов на повторяющиеся символы, замена и удаление найденных дублей.

Источник: http://prologistic.com.ua/kak-ubrat-povtoryayushhiesya-simvoly-iz-stroki-v-java.html

Смотри также:



Комментариев нет:

Отправить комментарий