Прежде всего, это домашнее задание, и мне нужна помощь, потому что я застрял. Я работал над этим часами и не мог понять. Я пытаюсь принять вводимые пользователем данные в виде строки, сохранить ее как массив символов и вывести символы в верхнем регистре без использования метода toUpperCase().

Я написал код до сих пор, и мой план состоит в том, чтобы создать два массива, которые содержат алфавит в нижнем регистре и алфавит в верхнем регистре, и создать цикл for и внутри этого оператора if, который заменяет символы в массиве char и выводит их в верхнем регистре. Но я не могу понять, как заменить персонажей. Вот что у меня получилось:

import java.util.Scanner;
class Q4{
    public static void main(String []args){
        Scanner input = new Scanner(System.in);
        System.out.print("Enter a String: ");
        String s = input.nextLine();
        String s1 = s.toLowerCase(); 
        char[] s2 = s1.toCharArray(); //Converts the String into a char Array

        char LowerAlp[] = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
        char UpperAlp[] = {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};

        for(int i=0; i<s2.length; i++){
            if(s2==LowerAlp){
                //Here is the problem
            }

        }
    }
}
-4
Vishal 3 Сен 2016 в 19:04

4 ответа

Лучший ответ

Я не думаю, что вам нужны массивы:

for(int i = 0; i < s2.length; ++i)
{
    if('a' <= s2[i] && s2[i] <= 'z')
        s2[i] += 'A' - 'a';
}
3
Aconcagua 28 Сен 2016 в 15:55

Коды символов сохраняют символы алфавита в последовательной форме, поэтому разница между 'a' и 'A' такая же, как разница между 'b' и 'B'. Эти знания можно использовать для преобразования нижнего регистра в верхний регистр:

int diff = 'A' - 'a';
String lower = "this is lowercase";
StringBuilder sb = new StringBuilder(lower.length());
for (char c : lower.toCharArray()) {
    if (c >= 'a' && c <= 'z') {
        c = (char)(c + diff);
    }
    sb.append(c);
}
String upper = sb.toString();
2
Mureinik 3 Сен 2016 в 16:13

Оба других ответа лучше справятся с вашей проблемой, но чтобы дать вам ответ, который очень близок к вашему примеру, следующее выполнит эту работу

import java.util.Scanner;
class Q4{
    public static void main(String []args){
        Scanner input = new Scanner(System.in);
        System.out.print("Enter a String: ");
        String s = input.nextLine();
        String s1 = s.toLowerCase();
        char[] s2 = s1.toCharArray(); //Converts the String into a char Array
        char[] res = new char[s2.length];

        char LowerAlp[] = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
        char UpperAlp[] = {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};

        String lowerAlphabet = new String(LowerAlp);

        int i = 0;
        for (char aS2 : s2) {
            res[i++] = UpperAlp[lowerAlphabet.indexOf(aS2)];
        }

        System.out.println(res);
    }
}
1
baao 3 Сен 2016 в 16:18

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

Похоже, вы неправильно подходите к своей проблеме.

Вместо хранения двух массивов HashMap будет быть лучшей альтернативой. С помощью HashMap вы можете явно сопоставить все символы нижнего регистра с символами верхнего регистра.

Примере

1. Инициализируйте HashMap.

HashMap<Character, Character> uppercaseAlphabet = new HashMap<Character, Character>();

Это создаст для вас новую HashMap, которая сопоставляет символы с другими символами .

Не забудьте import java.util.HashMap.

2. Заполните HashMap алфавитом.

uppercaseAlphabet.put('a', 'A');
uppercaseAlphabet.put('b', 'B');
uppercaseAlphabet.put('c', 'C');

И т. Д. Вам нужно будет сделать это для остальной части алфавита, иначе вы можете столкнуться с NullPointerException.

3. Используйте HashMap

char[] myLetters = "hello world!".toCharArray();

for (char letter : myLetters) {
    if (uppercaseAlphabet.contains(letter) {
        char uppercaseLetter = uppercaseAlphabet.get(letter);
        System.out.print(uppercaseLetter);
    } else {
        System.out.print(letter);
    }        
}

Этот код будет ...

  1. Перебрать мой массив символов.
  2. Если буква есть на карте, найдите эквивалент в верхнем регистре и распечатайте его.
  3. В противном случае просто напечатайте символ как есть.

Этот код нигде не хранит строку в верхнем регистре, он просто печатает ее. Вы можете сделать его намного лучше, добавив каждый символ в StringBuilder.


Если вам нужно намного более чистое решение (о котором, к сожалению, я не подумал), я бы порекомендовал Mureinik's . Хотя решение HashMap может оказаться полезным, если вам когда-нибудь понадобится сопоставить определенные символы, которые не имеют такого последовательного шаблона.

1
byxor 3 Сен 2016 в 16:41