Как я могу инвертировать случай String в Java?

Я хочу изменить строку так, чтобы все символы в верхнем регистре становились строчными, а все символы нижнего регистра – в верхнем регистре. Числовые символы просто игнорируются.

поэтому “AbCdE123” становится “aBcDe123”

Я предполагаю, что должен быть способ итерации через String и переворачивать каждый символ, или, возможно, какое-то регулярное выражение, которое могло бы это сделать.

Я не верю, что есть что-то встроенное для этого (это относительно необычно). Это должно сделать это, хотя:

public static String reverseCase(String text) { char[] chars = text.toCharArray(); for (int i = 0; i < chars.length; i++) { char c = chars[i]; if (Character.isUpperCase(c)) { chars[i] = Character.toLowerCase(c); } else if (Character.isLowerCase(c)) { chars[i] = Character.toUpperCase(c); } } return new String(chars); } 

Обратите внимание, что это не делает изменения, зависящие от локали, которые String.toUpperCase / String.toLowerCase делает. Он также не обрабатывает символы, отличные от BMP.

У Apache Commons StringUtils есть метод swapCase .

Я предполагаю, что должен быть способ итерации по String и переворачивать каждый символ

Верный. Класс java.lang.Character предоставляет вам каждый метод isUpperCase() . Протестируйте его и используйте toLowerCase() или toUpperCase() зависимости от результата. Добавьте результат каждого к StringBuilder и все должно быть в порядке.

Основываясь на подходе Фараза, я думаю, что преобразование символов может быть таким простым, как:

 t += Character.isUpperCase(c) ? Character.toLowerCase(c) : Character.toUpperCase(c); 

Java 8 и выше:

 String myString = "MySampleString123"; System.out.println(myString.chars().map(c -> Character.isLetter(c) ? c ^ ' ' : c).collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append).toString()); 

Код, который инвертирует букву, важно заметить:

 Character.isLetter(c) ? c ^ ' ' : c 

Мы также можем использовать объект StringBuilder, поскольку он имеет методы замены символов. Однако для хранения объекта StringBuilder может потребоваться некоторое дополнительное пространство. Таким образом, это поможет, если пространство не имеет значения и простое понимание этого решения.

 String swapCase(String text) { StringBuilder textSB = new StringBuilder(text); for(int i = 0; i < text.length(); i++) { if(text.charAt(i) > 64 && text.charAt(i) < 91) textSB.setCharAt(i, (char)(text.charAt(i) + 32)); else if(text.charAt(i) > 96 && text.charAt(i) < 123) textSB.setCharAt(i, (char)(text.charAt(i) - 32)); } return textSB.toString(); } 
 public class ReverseCase { public static void main(String[] args){ char[] char_arr = args[0].toCharArray(); for (int i = 0; i < char_arr.length; i++) { if (Character.isLowerCase(char_arr[i])) { char_arr[i] = Character.toUpperCase(char_arr[i]); }else { char_arr[i] = Character.toLowerCase(char_arr[i]); } } String reversed = new String(char_arr); System.out.println(reversed); } } в public class ReverseCase { public static void main(String[] args){ char[] char_arr = args[0].toCharArray(); for (int i = 0; i < char_arr.length; i++) { if (Character.isLowerCase(char_arr[i])) { char_arr[i] = Character.toUpperCase(char_arr[i]); }else { char_arr[i] = Character.toLowerCase(char_arr[i]); } } String reversed = new String(char_arr); System.out.println(reversed); } } порядке public class ReverseCase { public static void main(String[] args){ char[] char_arr = args[0].toCharArray(); for (int i = 0; i < char_arr.length; i++) { if (Character.isLowerCase(char_arr[i])) { char_arr[i] = Character.toUpperCase(char_arr[i]); }else { char_arr[i] = Character.toLowerCase(char_arr[i]); } } String reversed = new String(char_arr); System.out.println(reversed); } } 

Я действительно понимаю, что данный stream очень старый, но есть лучший способ его решения:

 class Toggle { public static void main() { String str = "This is a String"; String t = ""; for (int x = 0; x < str.length(); x++) { char c = str.charAt(x); boolean check = Character.isUpperCase(c); if (check == true) t = t + Character.toLowerCase(c); else t = t + Character.toUpperCase(c); } System.out.println (t); } } 
  • Как удалить все не буквенно-цифровые символы из строки в c ++?
  • Разделение на запятую вне цитат
  • Почему строковые литералы const?
  • Добавить нулевое дополнение к строке
  • C ++ - многократное использование istringstream
  • Почему изменение строки через извлеченный указатель на его данные не разрешено?
  • Разделить строку на подстроки равной длины в Java
  • Ошибка: недопустимые операнды типов 'const char ' и 'const char ' для двоичного 'оператора +'
  • В C #, почему String является ссылочным типом, который ведет себя как тип значения?
  • Скопировать содержимое streambuf в строку
  • Java: Является ли assertEquals (String, String) надежным?
  • Interesting Posts

    Могу ли я заставить dpkg игнорировать ошибку, возвращаемую после сценария после установки?

    Почему 248×248 максимальный размер двумерного массива, который я могу объявить?

    Xcode: код теряет синтаксическую окраску

    Radeon 6950 – Извращение текста и графики только в некоторых Windows

    Действие по умолчанию для выполнения при нажатии ввода в форме

    Предоставляет ли C ++ 11 вектор ?

    как проверить размер экрана iphone 4 и iphone 5 программно в быстром

    Как использовать ссылочные переменные по символьной строке в формуле?

    Лучший способ получить доступ к ext partion в окнах?

    Внешний жесткий диск непризнан в Win10, но отлично работает в Win8.1

    Как веб-браузер всегда отправляет конечную косую черту после имени домена?

    Как отключить ведение журнала в Ruby on Rails для каждого действия?

    При запуске WebDriver с браузером Chrome, получая сообщение, разрешены только локальные подключения, даже если браузер запускается правильно

    iTextSharp – отправка PDF в формате PDF в приложении электронной почты

    JFreechart Loop через сектора полярных диаграмм

    Давайте будем гением компьютера.