#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
. Вы знаете, что результирующая строка будет иметь ту же длину, что и исходная строка, поэтому вы можете сделать это следующим образом:
- Создайте массив с помощью String .toCharArray.
- Выполните итерацию с обоих концов одновременно, используя индексы
i
иj
. Начните индексi
с 0, двигаясь вперед, а j с длины массива — 1, двигаясь назад. - Проверьте элементы в i и j на наличие буквы, используя Character.isLetter . Если это не буква, просто пропустите ее, переместив i вперед или j назад.
- Поменяйте местами элементы массива в i и j.
- Повторяйте, пока i < j .
- Создайте новую строку, используя
new String(charArray)
Поскольку это похоже на упражнение, я оставлю фактическое кодирование вам.
Предостережение: приведенное выше работает только для строк, где кодовые точки Unicode находятся в базовой многоязычной плоскости (т. Е. Большинство строк для вас и меня). Это не будет работать для сложных ситуаций, содержащих определенные символы, такие как смайлики (для получения дополнительной информации об этой потенциальной проблеме см. https://dzone.com/articles/the-right-way-to-reverse-a-string-in-java ).
Комментарии:
1. Спасибо, что нашли время, чтобы подробно ответить на вопрос. Ценю.