У меня есть аргумент типа char. Я хочу проверить, что этот символ имеет нижний регистр, если это правда, тогда я сделаю логическую переменную равной true, в противном случае сделаю ее равной false. Я создал массив символов:

String argumentStr = args[2];
char argument = argumentStr.charAt(0);
boolean acceptArgument;

char[] lowerCaseAlphabet = {'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'};

Затем я попробовал два разных решения, но каждое из них выходит за рамки моего логического параметра acceptArgument.

Первый:

for (int i = 0; i < 27; i++) {
        if (argument == lowerCaseAlphabet[i]) {
            acceptArgument = true;
        } else {
            acceptArgument = false;
        }
    }

Во-вторых :

for (char letter: lowerCaseAlphabet) {
        if (argument == letter) {
            acceptArgument = true;
        } else {
            acceptArgument = false;
        }
    }

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

0
Terminal Guy 19 Сен 2018 в 19:47

2 ответа

Лучший ответ

Я понимаю, почему это не сработает, из-за объема операторов if по сравнению с логическим значением acceptArgument

Нет. Причина не в области видимости, а в том, что на каждой итерации acceptArgument получает либо false, либо true в зависимости от условия if, пока он не завершит весь цикл, потому что вы не использовали никаких break или что-нибудь, чтобы выйти из цикла, когда совпадение найдено.

Например, если argument = 'p', он найдет совпадение в letter='p', и поэтому для acceptArgument будет установлено значение true. Однако цикл переходит к следующей букве q, поскольку p != q, acceptArgument будет установлен на false, и так будет продолжаться. вот почему он не работает так, как вы ожидаете.

См. исправление ниже

Чтобы исправить свой код, внесите следующие изменения

Сначала инициализируйте;

boolean acceptArgument=false;

Второе удаление else должно быть так

for (char letter: lowerCaseAlphabet) {
    if (argument == letter) 
        acceptArgument = true;          
}

Оно работает.

0
The Scientific Method 19 Сен 2018 в 17:50

Для этого вам не нужен дополнительный массив. Вы можете проверить, является ли argument строчными буквами, сравнив результат с Character.toLowerCase(char), например

char argument = argumentStr.charAt(0);
boolean acceptArgument = argument == Character.toLowerCase(argument);

или (как указано @JBNizet) используйте Character.isLowerCase(char) как

boolean acceptArgument = Character.isLowerCase(argument);

Если вам также нужно проверить, является ли символ буквой, вы можете добавить и для этого вроде

boolean acceptArgument = Character.isLetter(argument) 
        && Character.isLowerCase(argument);
1
Elliott Frisch 19 Сен 2018 в 17:05