84 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

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

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

1. Обзор

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

Для каждой техники мы также кратко поговорим о ее времени и сложности пространства.

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

Начнем с удаления дубликатов из нашей строки с помощью метода distinct , представленного в Java 8

В приведенном ниже коде мы получаем экземпляр IntStream из данного строкового объекта. Затем мы используем метод distinct для удаления дубликатов. Затем мы используем forEach , чтобы перебрать отдельные символы и добавить их в наш StringBuilder :

Сложность времени: ** _ O (n) _ – время выполнения цикла прямо пропорционально размеру входной строки

Вспомогательное пространство: ** O (n) – поскольку _distinct создает промежуточный LinkedHashSet_ для поддержания порядка

Поддерживает порядок: ** Да

И, хотя приятно, что Java 8 так хорошо справляется с этой задачей, давайте сравним ее с усилиями по выполнению наших собственных задач.

3. Использование indexOf

Наивный подход к удалению дубликатов из строки просто включает в себя цикл ввода и использование метода _indexOf _ , чтобы проверить, существует ли уже символ в результирующей строке :

Сложность времени: _ O (n n) _ – время выполнения цикла прямо пропорционально квадрату размера входного набора данных

Вспомогательное пространство: ** O (1) – постоянное пространство требуется для хранения нашего индекса и символьных значений в цикле

Поддерживает порядок: ** Да

Это имеет то преимущество, что не имеет вспомогательного пространства, но работает намного медленнее, чем подход Core Java.

4. Использование массива символов

Мы также можем удалить дубликаты из нашей строки, преобразовав ее в массив char , а затем перебрав каждый символ и сравнив его со всеми последующими символами .

Как мы видим ниже, мы создаем два цикла for и проверяем, повторяется ли каждый элемент в строке. Если дубликат найден, мы увеличиваем repeatedCtr , чтобы не добавлять его в StringBuilder :

Сложность времени: __ O (n n) – у нас есть внутренний и внешний цикл, оба требуемые n __iterations

Вспомогательный пробел: ** O (1) – для хранения _repeatedCtr _ требуется постоянный пробел, который зависит от количества повторяющихся символов в строке ввода

Поддерживает порядок: ** Нет

Опять же, наша вторая попытка работает плохо по сравнению с предложением Core Java, но давайте посмотрим, куда мы попадем с нашей следующей попыткой.

5. Использование сортировки

Кроме того, повторяющиеся символы могут быть устранены путем сортировки нашей входной строки для группировки дубликатов. Чтобы сделать это, мы должны преобразовать строку в _char a rray и отсортировать ее, используя статический метод Arrays sort. Наконец, мы будем перебирать отсортированный массив char_ .

На каждой итерации мы будем сравнивать каждый элемент массива с предыдущим элементом. Если элементы отличаются, мы добавим текущий символ в StringBuilder:

Сложность времени: ** _ O (n log n) – сортировка сравнения по массиву имеет наихудшую временную сложность O (n log n) _

Вспомогательное пространство: ** O (n)sort использует Quicksort, который использует O (n) вспомогательное пространство, а __toCharArray создает копию String __anyway

Поддерживает порядок: ** Нет

Итак, мы начинаем видеть пространственно-временной компромисс. Здесь мы обменяли место на лучшую производительность. Давайте попробуем это снова с нашей последней попыткой.

6. Использование Set

Другой способ удалить повторяющиеся символы из строки – использование Set . Если мы не заботимся о порядке символов в нашей выходной строке, мы можем использовать HashSet . В противном случае мы можем использовать _LinkedHashSet _ для поддержания порядка вставки.

В обоих случаях мы зациклим входную строку и добавим каждый символ в Set . После того, как символы будут вставлены в набор, мы проведем итерацию по нему, чтобы добавить их в _StringBuilder _ и вернуть нашу полученную строку:

Сложность времени: ** _ O (n) _ – время выполнения цикла прямо пропорционально размеру входной строки

Вспомогательное пространство: ** O (n) – пространство, необходимое для Set , зависит от размера входной строки

Поддерживает порядок: ** _LinkedHashSet – Да, HashSet _ – Нет

И теперь мы соответствовали подходу Core Java! Не очень шокирующе узнать, что это очень похоже на то, что _distinct _ уже делает.

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

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

Как всегда, фрагменты кода можно найти на over на GitHub .

Читать еще:  Пользовательское соглашение об использовании сайта

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

Строка — это упорядоченная последовательность символов. В Java строка является основным носителем текстовой информации. Для работы со строками здесь используются следующие классы: String, StringBuilder, StringBuffer. В этом уроке речь пойдет о классе String, его на первых порах будет вполне достаточно.

В данном уроке рассматривается:

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

Но начнем с самого начала.

Создание строк

Строка в Java является объектом, поэтому ее можно создать, как и любой другой объект, при помощи оператора new.

Также строку можно создать при помощи литерала (фразы заключенной в кавычки) следующим образом.

Обе строки, независимо от способа создания являются объектами — экземплярами класса String.

Важный момент: создание объектов при помощи литерала возможно только в классе String. Объекты любого другого класса при помощи литерала создать нельзя.

Можно также создать массив строк. Например, так:

Подробнее о массивах и их создании написано в уроке 10 .

Конкатенация или слияние строк в Java

Для того, чтобы объединить несколько разных строк в одну, в Java можно использовать перегруженные (специально для объектов String) операторы «+» и «=+».

Еще один важный момент : операторы «+» и «=+», перегруженные для String, являются единственными перегруженными операторами в Java. Программист здесь не имеет возможности самостоятельно перегружать какие-либо операторы (как, например, в С++ и некоторых других языках).

Пример 1:

На консоль будет выведено «Мама мыла раму»

Пример 2:

Пример 3:

Наиболее употребительные методы класса String

При использовании IDE можно легко увидеть, какие методы есть у класса и получить подсказку по их использованию. На примере IDE Eclipse: для того, чтобы открыть список методов и быстро выбрать подходящий, нужно после имени переменной поставить точку и нажать комбинацию клавиш CTRL + Space (пробел). После этого появится окно, как на рисунке 14.1, где будут перечислены все доступные методы класса.

При выборе метода из этого списка, справа (или слева) появится желтое окно с подсказкой по его использованию. При помощи нажатия Enter или двойного клика мыши метод можно вставить в ваш код, не прибегая к ручному набору.
Также после имени переменной и точки можно начать набирать вручную имя метода и после введения нескольких первых букв нажать CTRL + Space (пробел). При этом, если метод, начинающийся на эти буквы один, то он автоматически подставится в код, если методов несколько, то откроется окно, как на рисунке 14.1, где будут перечислены только те методы, которые начинаются с этих введенных вами букв.
Это было лирическое отступление о том, как облегчить себе жизнь. Далее рассмотрим методы, которые чаще всего используются при работе со строками. Некоторые задачи можно решить и без применения этих методов, но их знание значительно облегчает процесс программирования. В дальнейшем описании, первое слово, которое стоит перед названием метода — тип значения, которое возникнет в результате работы метода (значение, которое метод возвращает).

Еще раз конкатенация

String concat(String str) — производит ту же конкатенацию, что была описана выше, но использование этого метода из класса String положительно влияет на производительность и скорость программы. На небольших примерах это незаметно и не существенно, но в более серьезных приложениях стоит использовать этот метод. Результатом работы метода будет строка. Параметр, который нужно передавать в метод для конкатенации — тоже строка, о чем нам говорит значение в скобках (String str).

Перепишем пример 2, при помощи concat():

Определение количества символов в строке

Для того чтобы определить количество символов в строке, используется метод length.

int length() возвращает длину строки. Длина равна количеству символов Unicode в строке.

Пример 4:

Извлечение символов из строки

Если нам требуется узнать, какой символ находиться в строке на конкретной позиции, можем использовать метод charAt.

char charAt(int index) возвращает символ, находящийся по указанному индексу в строке. Результатом работы метода будет символ типа char. Параметр, который передается в метод — целое число. Первый символ в строке, подобно массивам, имеет индекс 0.

Читать еще:  Где посмотреть какая система 32 или 64?

Пример 5: определить последний символ в строке.

Если мы хотим работать со строкой, как с массивом символов, можем конвертировать строку в массив при помощи метода toCharArray.

char[] toCharArray() — преобразует строку в новый массив символов.

Пример 6: поменять в строке символы пробела на точки при помощи преобразования в массив символов (для этой задачи есть более простое решение, нежели преобразование в массив, но об этом чуть позже).

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

Извлечение подстроки из строки

String substring(int beginIndex, int endIndex) или substring(int beginIndex) — возвращает новую строку, которая является подстрокой используемой строки. В параметрах метода нужно указать индекс строки, с которого начинается подстрока и индекс, которым заканчивается. Также возможно указывать только начальный индекс. В этом случае будет возвращена подстрока от начального индекса и до конца строки.

Пример 7.

Разбиение строк

Для разбиения строк на части используется метод String[] split(String regex), который разбивает строку на основании заданного регулярного выражения. О регулярных выражениях поговорим в одном из следующих уроков. Здесь покажем пример простого разбиения строки заданного одним символом.

Пример 8.

Поиск в строке

boolean contains(CharSequence s) — проверяет, содержит ли строка заданную последовательность символов и возвращает true или false.

Пример 9.

boolean endsWith(String suffix) — проверяет завершается ли строка определенными символами и возвращает true или false.

Пример 10.

boolean startsWith(String prefix) или startsWith(String prefix, int toffset) — проверяет, начинается ли строка с определенных символов. Во втором случае можно указать позицию с которой необходимо начать поиск префикса.

Пример 11.

int indexOf(int ch), indexOf(int ch, int fromIndex), indexOf(String str), indexOf(String str, int fromIndex) — метод indexOf применяется для поиска первого вхождения указанного символа в строке или первого вхождения указанной подстроки. Поиск также можно произвести с указанием позиции в строке от которой нужно начинать искать. Для поиска нужно указать соответствующие параметры. Метод возвращает число соответствующее индексу первого вхождения символа или подстроки. В случае отсутствия указанного символа или подстроки в строке, будет возвращена -1.

Пример 12

int lastIndexOf(int ch), lastIndexOf(int ch, int fromIndex), lastIndexOf(String str), lastIndexOf(String str, int fromIndex) — аналогично предыдущему случаю, только ищется последнее вхождение символа или подстроки в строке.

Модификация строк

Модификация строк не является модификацией как таковой. Дело в том, что объекты класса String после создания уже нельзя изменять. Но можно создать копию строки с изменениями. Именно это и делают следующие методы.
toLowerCase() — преобразовать строку в нижний регистр;
toUpperCase() — преобразовать строку в верхний регистр;
trim() — отсечь на концах строки пустые символы;

String replace(char oldChar, char newChar), replace(CharSequence target, CharSequence replacement) — замена в строке одного символа или подстроки на другой символ или подстроку.

Вспомним пример 6, где нужно было поменять в строке символы пробела на точки и перепишем его с использованием replace:

Сравнение строк

boolean equals(Object anObject) — проверяет идентичность строк. Возвращает true только в том случае, если в строках представлена одинаковая последовательность символов одной величены.

Пример 14

int compareTo(String anotherString) — так же проверяет идентичность строк, однако, в отличии от метода equals возвращает:

  • нулевое значение, если строки равны,
  • целое отрицательное число, если первая строка предшествует второй
  • целое положительное число, если первая строка следует за второй

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

Рассмотрим пример с именами «Маша» и «Миша». При сравнении этих двух имен (пример 15), метод compareTo укажет, что имя «Маша» предшествует имени «Миша» (выдав отрицательное число) или наоборот, «Миша» следует за «Маша» (выдав положительное число). При упорядочивании имен по алфавиту мы бы упорядочили эти имена именно так. Метод в данном случае определяет, что числовое значение буквы «а» в «Маша» меньше, чем числовое значение «и» в Миша.

Читать еще:  Какая программа является текстовым редактором?

Пример 15

Однако, в случае, если мы напишем «маша» с маленькой буквы и попробуем сравнить с «Миша», то получим положительное число.

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

Для сравнения строк без учета регистра символов используется функция int compareToIgnoreCase(String str)

Как мы видим, при сравнивании «маша» с «Миша» мы снова получаем отрицательное значение, то есть «маша» предшествует имени «Миша».

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

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

5 Ответов

Если вам не разрешено использовать дополнительную память и очень удобные наборы Java, тогда есть имплицитный алгоритм, чтобы сделать то, что вы хотите, это O(NlogN) вместо очевидного решения O(N^2), которое вы предлагаете.

Пояснить пункт 2 :

теперь мы фильтруем Xs:

Это на самом деле O(nlogn + 2n), который может быть упрощен до O(nlogn).

Удачи с реализацией, но это должно быть довольно просто. Если вы не можете использовать Arrays.sort(

) реализовать свою собственную функцию сортировки, я предлагаю QuickSort или MergeSort, поскольку они определяют общую производительность этого решения.

Вы можете хранить элементы в HashSet, что автоматически удаляет повторение

Вы можете добавить строки в HashSet, он удаляет дубликаты.

Когда вы заменяете текст в файле, я часто читаю весь файл в память, делаю любые манипуляции, которые я хочу сделать, а затем записываю все это обратно в файл. Мне не нравится раздавать ответ, поэтому я дам вам что-то подобное. Например, в псевдокоде:

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

Если у вас есть содержимое файла (см. Этот вопрос для рекомендаций: чтение обычного текстового файла в Java ), то самый простой способ удалить дубликаты из списка-поместить их в набор:

Если у вас есть набор уникальных строк, вы можете просто записать их обратно в файл (см. Этот вопрос для рекомендаций: как создать файл и записать его в Java? )

Похожие вопросы:

Я понятия не имею, как удалить недопустимые символы из строки в Java. Я пытаюсь удалить все символы, которые не являются цифрами, буквами или ( ) [ ] . Как я могу это сделать? Спасибо

Глядя на одну строку C# код, который бы удалить повторяющиеся символы из строки. Сделали это с помощью простого цикла с look-ahead, но хотели бы видеть regex soln. Экс. вход =.

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

Мне нужно удалить повторяющиеся символы из строки, например: abcdab => abcd aaabbc => abc Как это сделать на JS (maybee с помощью $.уникальный или что-то еще) ?

Я нашел способ удалить повторяющиеся символы из строки с помощью регулярных выражений. function RemoveDuplicates() < var str = aaabbbccc; var filtered = str.replace(/[^ws]|(.)1/gi, );.

Мне нужно удалить все повторяющиеся строки из файла, но игнорируя все появления этих символов: (),、“”。!?# Например, эти две строки будут считаться дубликатами, поэтому одна из них будет удалена.

У меня есть строка, например, acaddef или bbaaddgg . Я должен удалить из него, как можно быстрее, все повторяющиеся символы. Так, например, pooaatat после должно выглядеть как poat и ggaatpop должно.

Как я могу удалить соседние повторяющиеся символы в строке без учета регистра? Например: string = ‘HaPpy Bbirthday. ‘ Ожидаемый Результат: ‘Hay irthday’ Примечание : были удалены только соседние.

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

может ли кто-нибудь предложить мне, как удалить повторяющиеся символы из строки в java и тоже без использования строковых функций. Как я знаю, мы преобразуем заданную строку в символьный массив, а.

голоса
Рейтинг статьи
Ссылка на основную публикацию
Статьи c упоминанием слов: