Есть ли способ заполнить строку символами по некоторым определенным индексам?

#java #string

#java #строка

Вопрос:

Есть строка «привет, мир!». Любой символ, кроме A-Z и a-z, должен оставаться на том же месте, но буквы должны быть перевернуты. Итак, вывод будет «dlrow-olleh!».

Я использовал string builder для разработки решения, но мне любопытно, можно ли объявить строку длиной 12 и заполнить ее символы индексами 5 и 11, а затем заполнить оставшиеся перевернутыми буквами.

Любые другие методы или идеи для выполнения того же самого будут оценены.

         StringBuilder sb = new StringBuilder();

        for(int i=S.length()-1; i >= 0; i--) {
            String c = "" S.charAt(i);
            if(c.matches("[A-Za-z]")) {
                sb.append(c);
            }
        }

        for(int i = 0; i < S.length(); i  ) {
            String c = "" S.charAt(i);
            if(!c.matches("[A-Za-z]"))
                sb.insert(i,c);
        }
 

Я получил результат таким образом, но есть ли какой-нибудь способ использовать String здесь вместо StringBuilder ?

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

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

2. Обратите внимание, что строки неизменяемы в Java. Если вы «изменяете» строку, вы создаете новый объект. StringBuilder (или массивы символов, как предложил @JBNizet) будет более эффективным.

3. Вам придется работать с массивом символов, как упоминалось в комментарии выше. Но StringBuilder — это просто обернутый символ[] с дополнительными функциями.

Ответ №1:

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

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

  1. Создайте массив с помощью String .toCharArray.
  2. Выполните итерацию с обоих концов одновременно, используя индексы i и j . Начните индекс i с 0, двигаясь вперед, а j с длины массива — 1, двигаясь назад.
  3. Проверьте элементы в i и j на наличие буквы, используя Character.isLetter . Если это не буква, просто пропустите ее, переместив i вперед или j назад.
  4. Поменяйте местами элементы массива в i и j.
  5. Повторяйте, пока i < j .
  6. Создайте новую строку, используя new String(charArray)

Поскольку это похоже на упражнение, я оставлю фактическое кодирование вам.

Предостережение: приведенное выше работает только для строк, где кодовые точки Unicode находятся в базовой многоязычной плоскости (т. Е. Большинство строк для вас и меня). Это не будет работать для сложных ситуаций, содержащих определенные символы, такие как смайлики (для получения дополнительной информации об этой потенциальной проблеме см. https://dzone.com/articles/the-right-way-to-reverse-a-string-in-java ).

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

1. Спасибо, что нашли время, чтобы подробно ответить на вопрос. Ценю.