Как я могу инвертировать регистр строки в Java? - PullRequest
12 голосов
/ 13 ноября 2009

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

, поэтому «AbCdE123» становится «aBcDe123»

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

Ответы [ 8 ]

20 голосов
/ 13 ноября 2009

Apache Commons StringUtils имеет метод swapCase .

16 голосов
/ 13 ноября 2009

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

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.

2 голосов
/ 28 апреля 2016

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

t += Character.isUpperCase(c) ? Character.toLowerCase(c) : Character.toUpperCase(c);
2 голосов
/ 13 ноября 2009

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

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

1 голос
/ 29 августа 2018

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
0 голосов
/ 01 сентября 2018
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);
    }
}
0 голосов
/ 03 апреля 2016

Мы также можем использовать объект 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();
}
0 голосов
/ 27 января 2015

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

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);
    }
}
...