Java - преобразование нижнего регистра в верхний без использования toUppercase()

Я пытаюсь создать короткую программу, которая будет преобразовывать все прописные буквы в строчные (из ввода командной строки).

Следующее компилируется, но не дает ожидаемого результата. В чем может быть причина этого??

Например) java toLowerCase BANaNa -> для вывода банана

 public class toLowerCase{
        public static void main(String[] args){

            toLowerCase(args[0]);
        }

        public static void toLowerCase(String a){

            for (int i = 0; i< a.length(); i++){

                char aChar = a.charAt(i);
                if (65 <= aChar && aChar<=90){
                    aChar = (char)( (aChar + 32) ); 
                }

                System.out.print(a);
            }
         }   
    }

person Betty Jones    schedule 28.04.2013    source источник
comment
вы напечатали a, что совпадает с тем, что вы передали в качестве аргумента, измените System.out.print(a); на System.out.print(aChar);   -  person Ram Bhandari    schedule 15.11.2018


Ответы (9)


Похоже на домашнее задание для меня, Просто намек. Вы печатаете строку a, в то время как вы изменяете тип char aChar, не изменяя исходную строку a. (Помните, что строки неизменяемы).

person Habib    schedule 28.04.2013
comment
Хм. Итак, я должен создать новую пустую строку, в которую я добавлю новые типы символов? - person Betty Jones; 28.04.2013
comment
@BettyJones, да, это может быть одним из способов, или вы можете просто напечатать только что созданный символ, поскольку вы не возвращаете строку. - person Habib; 28.04.2013

Вы печатаете String a, не изменяя его. Вы можете напечатать char непосредственно в цикле следующим образом:

public class toLowerCase
{
    public static void main(String[] args)
    {
        toLowerCase(args[0]);
    }

    public static void toLowerCase(String a)
    {
        for (int i = 0; i< a.length(); i++)
        {
            char aChar = a.charAt(i);
            if (65 <= aChar && aChar<=90)
            {
                aChar = (char)( (aChar + 32) ); 
            }
            System.out.print(aChar);
         }
     }
}    
person Rahul Bobhate    schedule 28.04.2013
comment
Есть ли для этого какая-либо утилита, такая как apache/google api? Я хочу преобразовать регистр для char[]/CharSequence без использования String между ними. Пожалуйста, помогите. - person Kanagavelu Sugumar; 02.09.2019

Более чистый способ написания этого кода:

public static void printLowerCase(String a){
    for(char ch: a.toCharArray()) {
       if(ch >= 'A' && ch <= 'Z')
          ch += 'a' - 'A';
       System.out.print(ch);
    }
}

Примечание: это не будет работать для символов верхнего регистра в любом другом диапазоне. (их 1000)

person Peter Lawrey    schedule 28.04.2013
comment
Есть ли для этого какая-либо утилита, такая как apache/google api? Я хочу преобразовать регистр для char[]/CharSequence без использования String между ними. Пожалуйста, помогите. - person Kanagavelu Sugumar; 02.09.2019

Похоже, ты рядом. :)

Для начинающих...

char aChar = a.charAt(i);

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

char aChar = a[i].charAt(0);

и также кажется, что вы хотите вернуть значение измененной переменной, а не «a», которая была первоначально передана в переменной.

System.out.print(aChar);

нет

System.out.print(a);

Надеюсь, это поможет вам.

person Robert Bolton    schedule 28.04.2013

public static void toLowerCase(String a){

    String newStr = "";

    for (int i = 0; i< a.length(); i++){

        char aChar = a.charAt(i);
        if (65 <= aChar && aChar<=90){
            aChar = (char)( (aChar + 32) ); 
        }
        newStr = newStr + aChar;    
    }
    System.out.println(newStr);
}

Вы должны напечатать newStr вне цикла for. Вы пытались напечатать его внутри цикла

person Akshar Raaj    schedule 28.04.2013

public class MyClass
{
    private String txt;
    private char lower;
    public MyClass(String txt)
    {
        this.txt = txt;
    }
    public void print()
    {
        for(int i=0;i<txt.length();i++)
        {
            if('A' <= txt.charAt(i) && txt.charAt(i) <= 'Z')
            {
                lower = (char)(txt.charAt(i) + 32);
                System.out.print(lower);
            }
            else
            {
                lower = txt.charAt(i);
                System.out.print(lower);
            }
        }
    }
    public static void main(String[] args)
    {
        MyClass mc = new MyClass("BaNaNa");
        mc.print();
    }
}

Извините довольно поздно на сцену, но это должно решить ее. Другое условие, потому что, когда оно не равно нулю, оно полностью отбрасывает алфавит.

person Pratik Rai    schedule 16.09.2017

Если кому-то нужен чистый код без MagicNumbers и как можно меньше конверсий, вот мое решение:

final char[] charArray = new char[string.length()];
for (int i = 0; i < string.length(); i++) {
    char c = string.charAt(i);
    charArray[i] = Character.isLowerCase(c) ? Character.toUpperCase(c) : Character.toLowerCase(c);
}
String.valueOf(charArray);
person Chuck    schedule 15.01.2018

person    schedule
comment
Этот код не меняет регистр в строке, а просто печатает символы с измененным регистром. Не удается напечатать что-либо для символов, которые не являются буквами или пробелами. Он вообще не обрабатывает символы, отличные от ASCII. Причина, по которой код спрашивающего не работает, заключается в том, что он должен вычитать 32, а не прибавлять 32 к символам в диапазоне 65...90. - person Graham Asher; 23.02.2017

person    schedule
comment
пожалуйста, проверьте форматирование и добавьте некоторые пояснения. Ответ не обеспечивает функциональности, о которой просил автор вопроса, поскольку он преобразует только один символ. - person Michael Lihs; 10.01.2017