Перейти к основному содержимому

Добавить символ в строку в заданной позиции

· 3 мин. чтения

Задача: Наибольшая подстрока без повторений

Для заданной строки s, найдите длину наибольшей подстроки без повторяющихся символов. Подстрока — это непрерывная непустая последовательность символов внутри строки...

ANDROMEDA 42

1. Введение

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

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

Поскольку класс String является окончательным и неизменяемым , функция должна возвращать новую строку с добавленным символом.

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

Здесь идея состоит в том, чтобы создать новый массив символов и скопировать символы из исходной строки перед заданной позицией.

После этого мы помещаем новый символ в позицию и копируем остальные символы из исходной строки в последующие позиции нового массива.

Наконец, мы создаем нужную строку из этого массива.

public String addChar(String str, char ch, int position) {
int len = str.length();
char[] updatedArr = new char[len + 1];
str.getChars(0, position, updatedArr, 0);
updatedArr[position] = ch;
str.getChars(position, len, updatedArr, position + 1);
return new String(updatedArr);
}

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

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

Более простой и высокоуровневый подход — использовать метод substring() класса String . Он подготавливает строку путем объединения:

  1. Подстрока исходной строки перед позицией
  2. Новый персонаж
  3. Подстрока исходной строки после позиции
public String addChar(String str, char ch, int position) {
return str.substring(0, position) + ch + str.substring(position);
}

Хотя приведенный выше код более удобочитаем, у него есть недостаток, заключающийся в том, что он создает ряд временных объектов для определения результата. Поскольку String является неизменяемым классом, каждый вызов его метода substring() создает новый экземпляр String .

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

Эта реализация также должна трижды копировать все символы из одного массива в другой.

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

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

StringBuilder — это служебный класс, предоставляемый библиотекой Java для создания объектов String и управления ими различными способами.

Мы можем реализовать ту же функциональность, используя метод insert() класса StringBuilder :

public String addChar(String str, char ch, int position) {
StringBuilder sb = new StringBuilder(str);
sb.insert(position, ch);
return sb.toString();
}

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

Хотя использование StringBuilder может быть медленнее, оно не требует памяти для инициализации временных объектов. Мы также получаем простой и читаемый код.

5. Вывод

В этой статье мы сосредоточились на нескольких способах добавления символа в объект String в Java . Мы видели, что реализация с использованием массива символов обеспечивает наилучшую производительность, а реализация с использованием метода подстроки обеспечивает более читаемый подход.

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

Как обычно, полный исходный код приведенного выше руководства доступен на GitHub .