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

Как добавить символ в строку

  • автор:

Как добавить символ в строку

Argument ‘Topic id’ is null or empty

Сейчас на форуме

© Николай Павлов, Planetaexcel, 2006-2023
info@planetaexcel.ru

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

ООО «Планета Эксел»
ИНН 7735603520
ОГРН 1147746834949
ИП Павлов Николай Владимирович
ИНН 633015842586
ОГРНИП 310633031600071

вставка символа в строку

Задача простая — есть строка, например std::string(«sfsfsgsdshhdfjj»), необходимо вставить через каждый второй символ символ «-«.Не пойму как такое реализовать, пожалуйста подскажите.

Отслеживать
задан 28 апр 2016 в 5:19
1,973 3 3 золотых знака 17 17 серебряных знаков 34 34 бронзовых знака

Не правьте, пожалуйста, вопросы, изменяя метки, меняя точки на запятые и добавляя кавычки/ненужные метки, зарабатывая по +2 репутации. Вносите бОльшие изменения в вопрос, чтобы он был полезней, либо не меняйте его. Это не приносит пользы вопросам и сообществу в целом. Спасибо.

15 сен 2016 в 14:52

@Denis — пожалуйста! Исправлять орфографические ошибки и правила расстановки знаков препинания не нужно? Нет? Делать вопросы более понятными для всех не нужно. Я все исправляю по правилам форума. Я не просто зарабатываю 2 балла репутации — но и делаю полезное дело! И да — это приносит пользу сообществу!

15 сен 2016 в 16:14

Например, вот эта правка не несёт пользы вопросу — кавычки тут не нужны, как и точка после ссылки, есть даже причина для отклонения таких правок — «Правка никак не делает сообщения более простым к прочтению, не упрощает его поиск, точность или доступность. Изменения абсолютно излишни или явно ухудшают читаемость.»

16 сен 2016 в 6:55

3 ответа 3

Сортировка: Сброс на вариант по умолчанию

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

string s("sfsfsgsdshhdfjj"); string d; for(auto c: s)

Update Как оказалось, не совсем верно понял, дефис надо через два на третий. Примерно так:

string d; for(size_t i = 0; i < s.length(); ++i) < d += s[i++]; if (i < s.length()) < d += s[i]; d += '-'; >> 

Отслеживать
ответ дан 28 апр 2016 в 5:39
219k 15 15 золотых знаков 119 119 серебряных знаков 230 230 бронзовых знаков
я бы добавил: d.reserve(s.length()*2-1)
28 апр 2016 в 5:58

Да, согласен, несколько быстрее. Тут — ideone.com/Jmlwde — сравнение с резервированием, без и с методом вставкой.

28 апр 2016 в 6:17

А вообще, самый быстрый вот такой: ideone.com/B4C7xG объясняю почему: operator[] не выполняет никаких проверок вообще, а operator+= — выполняет. Как минимум — вдруг ёмкость исчерпалась, а значит нужно как бы и памяти добавить. Правило наименьшего оверхеда вкупе с наименьшим удивлением. Ваш вариант ещё и ошибку содержит: всегда добавляется — во конце, хотя не должен вообще. Пруф: ideone.com/VbE5RW

28 апр 2016 в 8:02

Решение @Harry быстрое, а если жалко памяти на два буффера сразу, то можно либо как у вас или так (дополнительной памяти O(1)):

// Резервируем память, что бы исключить реаллокации при вставке s.reserve(s.length()*3/2); for (size_t i = 2; i < s.length(); i+=2) s.insert(i++, 1, '-'); // инкремент тут нужен, что бы уйти с только что вставленного '-' 

Минус: оно медленное за счёт того, что при каждой вставке нужно делать memmove / memcpy для оставшихся символов.

UPD: поправлено под условие (каждый второй символ)

UPD2: самый (пока?) шустрый вариант (дополнительной памяти O(n)):

string str; str.resize(s.length() * 3/2); size_t size = 0; for (size_t i = 0; i < s.length(); ++i) < str[size++] = s[i++]; if (i < s.length()) < str[size++] = s[i]; if (i != s.length() - 1) str[size++] = '-'; >> // ;-) str.resize(size); 

Как добавить символ в строку

Привет, могу ли я как то штатно, вставить символ в центр строки?
НайденныйСимвол = Найти(SGTIN, """");
Если НайденныйСимвол > 1 Тогда
СтрЗаменить(SGTIN, """", """""");
Файл.ДобавитьСтроку("""" + СокрЛП(SGTIN) + """" + ",," + Цена + "," + СуммаНДС);
КонецЕсли;
Логика какая, в цикле ищу наличие символа (кавычки) ну и если они есть, мне нужно добавить еще одну (следующим символом)

Проверил через попытку, стр заменить выполняется, но изначальную строку никак не изменяет
SGTIN = СтрЗаменить(SGTIN, """", """""");

ну или вообще без (2) - тупо в одну строку:
Файл.ДобавитьСтроку("""" + СтрЗаменить(СокрЛП(SGTIN),"""","""""") + """" + ",," + Цена + "," + СуммаНДС);

(3) Да, действительно при каждом вхождении "" в строку добавляет еще одну, то что нужно, благодарь
(4) главное по этой строке повторно потом не пройтись
(5) Экранирование кавычек по-любому должно в несколько проходов идти.

2(6) Если уж экранировать кавычки, то тогда уж как-то так:
стр = "Тестовая строка: "" - это кавычка";
стр = ЗначениеВСтроку(стр);
стр = Сред(стр, 12);
стр = Лев(стр, СтрДлина(стр) - 2);

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

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

Поскольку класс 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 .

  • 1. Введение
  • 2. Использование массива символов
  • 3. Использование метода подстроки
  • 4. Использование StringBuilder
  • 5. Вывод

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *