как преобразовать буквы нижнего регистра в буквы верхнего регистра и буквы верхнего регистра в буквы нижнего регистра

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

//     in either Capital or lowercase depending on the original
//     letter changed.  For example:  CoMpUtEr will convert to
//     cOmPuTeR and vice versa.
    Switch.addActionListener(new ActionListener()
    {
        public void actionPerformed(ActionEvent e )

            String characters = (SecondTextField.getText()); //String to read the user input
            int length = characters.length();  //change the string characters to length

         for(int i = 0; i < length; i++)  //to check the characters of string..
         {             
            char character = characters.charAt(i);          

            if(Character.isUpperCase(character)) 
            {
                SecondTextField.setText("" + characters.toLowerCase());

            }
            else  if(Character.isLowerCase(character))
            {
                 SecondTextField.setText("" + characters.toUpperCase()); //problem is here, how can i track the character which i already change above, means lowerCase**
                }               
         }}     
    });

person akki0996    schedule 20.02.2013    source источник
comment
у вас есть else, поэтому, если он начинается с верхнего регистра, он не пройдет через 2-ю ветвь if. Если он начинается с нижнего регистра, он пройдет через вторую ветвь (а не первую) - какая проблема у вас на самом деле?   -  person John3136    schedule 20.02.2013
comment
согласованный. Вроде должно уже работать   -  person Memento Mori    schedule 20.02.2013
comment
О, я вижу проблему. Не устанавливайте character.toUpperCase() или что-то подобное. Меняйте только один символ за раз. Ваш цикл уже настроен для этого, но вы меняете регистр всей строки.   -  person Memento Mori    schedule 20.02.2013


Ответы (14)


setText изменяет текстовое содержимое именно на то, что вы ему даете, а не добавляет его.

Сначала преобразуйте String из поля, а затем примените его напрямую...

String value = "This Is A Test";
StringBuilder sb = new StringBuilder(value);
for (int index = 0; index < sb.length(); index++) {
    char c = sb.charAt(index);
    if (Character.isLowerCase(c)) {
        sb.setCharAt(index, Character.toUpperCase(c));
    } else {
        sb.setCharAt(index, Character.toLowerCase(c));
    }
}

SecondTextField.setText(sb.toString());
person MadProgrammer    schedule 20.02.2013
comment
Ты был быстрее меня =\, все равно +1 - person Luiggi Mendoza; 20.02.2013
comment
@LuiggiMendoza Я писал, пока вы редактировали вопрос;) - person MadProgrammer; 20.02.2013

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

1   for each character x:
2       if x is uppercase:
3           convert x to lowercase
4       else:
5           if x is lowercase:
6                convert x to uppercase.

Тот факт, что у вас там есть else (в строке 4), означает, что символ, который изначально был в верхнем регистре, никогда не будет проверяться во втором выражении if (в строке 5).

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

Если вы начнете с z, if в строке 2 отправит вас прямо на строку 5, где оно будет преобразовано в верхний регистр. Все, что не написано ни в верхнем, ни в нижнем регистре, не пройдет оба if утверждения и, следовательно, останется нетронутым.

person paxdiablo    schedule 20.02.2013

Вы можете использовать StringUtils.swapCase() из org.apache.commons

person Pshemo    schedule 20.02.2013

Это лучший метод: -

void main()throws IOException
{
    System.out.println("Enter sentence");
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    String str = br.readLine();
    String sentence = "";
    for(int i=0;i<str.length();i++)
    {
        if(Character.isUpperCase(str.charAt(i))==true)
        {
            char ch2= (char)(str.charAt(i)+32);
            sentence = sentence + ch2;
        }
        else if(Character.isLowerCase(str.charAt(i))==true)
        {
            char ch2= (char)(str.charAt(i)-32);
            sentence = sentence + ch2;
        }
        else
        sentence= sentence + str.charAt(i);

    }
    System.out.println(sentence);
}
person Shubham    schedule 02.02.2014

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

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

Вы можете сделать вывод String, установить для него пустую строку "" и добавлять к ней символы по ходу дела. Это сработает, но это неэффективный подход. Лучшим подходом было бы использование класса StringBuilder. , что позволяет вам изменить строку, не выбрасывая ее целиком.

person Sergey Kalinichenko    schedule 20.02.2013

Это лучший подход без использования какой-либо функции String.

public static String ReverseCases(String str) {
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < str.length(); i++) {
      char temp;
      if (str.charAt(i) >= 'a' && str.charAt(i) <= 'z') {
        temp = (char)(str.charAt(i) - 32);
      }
      else if (str.charAt(i) >= 'A' && str.charAt(i) <= 'Z'){
        temp = (char)(str.charAt(i) + 32);
      }
      else {
        temp = str.charAt(i);
      }

      sb.append(temp);
    }
    return sb.toString();
  }
person Amarjit Datta    schedule 13.06.2017

Вот вам другая версия:

общественный класс палиндром {

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    System.out.println("Enter a word to check: ");
    String checkWord = sc.nextLine();
    System.out.println(isPalindrome(checkWord));
    sc.close();

}

public static boolean isPalindrome(String str) {        
    StringBuilder secondSB = new StringBuilder();
    StringBuilder sb = new StringBuilder();
    sb.append(str);
    for(int i = 0; i<sb.length();i++){
        char c = sb.charAt(i);
        if(Character.isUpperCase(c)){
            sb.setCharAt(i, Character.toLowerCase(c));
        }
    }
    secondSB.append(sb);
    return sb.toString().equals(secondSB.reverse().toString());
}

}

person Tano    schedule 14.10.2015

Описание методов:

*toLowerCase()* Returns a new string with all characters converted to lowercase.

*toUpperCase()* Returns a new string with all characters converted to uppercase.

Например:

"Welcome".toLowerCase() возвращает новую строку добро пожаловать

"Welcome".toUpperCase() возвращает новую строку ДОБРО ПОЖАЛОВАТЬ

person Gautam Sarkar    schedule 03.07.2019

Если вы посмотрите на символы a-z, то увидите, что у всех у них 6-й бит установлен в 1. Где в A-Z 6-й бит не установлен.

A = 1000001    a = 1100001
B = 1000010    b = 1100010
C = 1000011    c = 1100011
D = 1000100    d = 1100100     
...
Z = 1011010    z = 1111010

Итак, все, что нам нужно сделать, это перебрать каждый символ из заданной строки, а затем выполнить XOR(^) с 32. Таким образом, 6-й бит может поменяться местами.

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

public final class ChangeStringCase {
    public static void main(String[] args) {
        String str = "Hello World";
        for (int i = 0; i < str.length(); i++) {
            char ans = (char)(str.charAt(i) ^ 32);
            System.out.print(ans); // Final Output: hELLO wORLD
        }
    }
}

Временная сложность: O(N), где N = длина строки.

Космическая сложность: O(1)

person Yachareni Krishnakanth    schedule 23.05.2020

person    schedule
comment
Пожалуйста, не просто публикуйте код. Дайте некоторое объяснение или информацию или использование вашего кода. Например, см. этот ответ. - person Nazik; 29.01.2014

person    schedule
comment
Можете ли вы уточнить свой ответ? Публикация фрагмента кода без текста часто не очень полезна. - person Noel Widmer; 28.08.2017

person    schedule
comment
Привет, Умарджон, в будущих ответах постарайтесь добавить краткое объяснение к своему ответу, которое поможет пользователю, задавшему вопрос, понять ваше решение и изучить его на - person Lupin; 19.04.2015

person    schedule
comment
Хотя этот фрагмент кода приветствуется и может оказать некоторую помощь, он был бы значительно улучшен, если бы включал объяснение того, как и почему это решает проблему. Помните, что вы отвечаете на вопрос читателей в будущем, а не только того, кто задает сейчас! Пожалуйста, отредактируйте свой ответ, чтобы добавить объяснение и указать, какие ограничения и предположения применяются. - person Toby Speight; 10.02.2017

person    schedule
comment
Также дайте некоторые пояснения к этому. - person Lovepreet Singh; 08.06.2018
comment
Это не отвечает на вопрос - person yunandtidus; 08.06.2018