Проверка того, является ли строка алфавитной

#java #boolean #java.util.scanner

#java #логическое значение #java.util.scanner

Вопрос:

Следующий код — это моя исчерпанная попытка проверить введенную строку на предмет того, находится ли она в алфавитном порядке или нет.

 import java.util.Scanner;

    public class order
    {
        public static void main ( String[] args )
        {
            Scanner scan = new Scanner ( System.in );  // Create a Scanner object
            boolean isInOrder;
            
            System.out.println ( "nnnnn"   "<EV> "Hello sir, please enter a string value for me ;)" "   "n" );
    
            String stringInput = scan.nextLine();
            System.out.println ( "n"   "<EV> "You entered: "   stringInput   """);
    
            for ( int alpha = 0; alpha != stringInput.length();   alpha )
            {
                if ( !Character.isLetter(stringInput.charAt(alpha)))
                {
                    isInOrder = false;
                }
                else
                {
                    isInOrder = true;
                }
            }
    
            System.out.println( "<EV> "It seems that the string you provided is...""   "n" );
    
            if ( isInOrder = false )
            {
                System.out.println( "<EV> "NOT alphabetical!"");
            }
            else if ( isInOrder = true )
            {
                System.out.println( "<EV> "Alphabetical!""   "n");
            }
    
            System.out.println( "~~~~~~~~~~~~~~~~~~~~~~");
        }
    }

 

Просто интересно, где я ошибаюсь, ошибки не помечаются, что еще более раздражает.

Комментарии:

1. Как только вы обнаружите первое нарушение — выйдите из цикла.

2. Ваш вопрос неясен. В названии вы говорите «алфавитный», а в тексте «в алфавитном порядке». Вы хотите проверить, содержит ли строка только буквы или эти буквы расположены в алфавитном порядке?

3. То, как вы написали свой код, ничто перед if оператором не может повлиять на результат. Оператор if, который вы написали, эквивалентен if (false) { ... } else if (true) { ... } . Вы понимаете, почему? На самом деле вы не проводили никакого сравнения. = Оператор выполняет встроенное присваивание, присваивая isInOrder то, что находится справа от = символа. Я полагаю, что вы ищете оператор равенства == , хотя вы могли бы просто полностью удалить оператор. if (isInOrder) { ... } else { ... } это был бы обычный способ сделать это.

4. Как сказал Чарли Армстронг, используйте if(isInOrder) или if(! isInOrder) для отрицания. Не используйте == для true и false , тогда вы не сможете спутать его с = .

Ответ №1:

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

  • Цикл For не останавливается, если найден неверный ввод: поскольку вы продолжаете выполнять цикл в цикле for, даже если вы обнаружите неправильный ввод, isInOrder логическое значение всегда будет содержать результат конечного символа
  • Ваша проверка if в конце подтверждает, что вы можете присвоить переменной значение false или true. Вам нужно использовать == здесь вместо =
  • Проверка на isInOrder == false наличие делает код более трудным для чтения, а сравнение совершенно бесполезно. Вы могли бы просто немедленно выставить свой чек. В части if вам просто нужно получить логический результат, который isInOrder уже возвращается для вас. if(isInOrder){<true part>} else {<false part>}

Код для цикла может выглядеть следующим образом

     for (int alpha = 0; alpha != stringInput.length();   alpha) {
        if (!Character.isLetter(stringInput.charAt(alpha))) {
            isInOrder = false;
            break;
        } else {
            isInOrder = true;
        }
    }
 

Оптимизация

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

 isInOrder = stringInput.chars().allMatch(Character::isLetter);
 

Ответ №2:

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

 boolean allLetters = true;

for (char c : alpha.toCharArray()) {
    if (!Character.isLetter(c)) {
        allLetters = false;
    }
}
 

Это также можно проверить, просто используя метод String::matches с регулярным выражением:

 boolean allLetters = alpha.matches("\p{L} "); // check any letters
// or alpha.matches("\p{Alpha} "); for Latin letters only
 

Чтобы проверить, что все символы расположены в алфавитном порядке, то есть c0 <= c1 <= c2 ... <= cN :

 boolean inOrder = true;
for (int i = 1, n = alpha.length(); i < n; i  ) {
    if (alpha.charAt(i - 1) > alpha.charAt(i)) { // order broken
        inOrder = false;
        break;
    }
}
 

Комментарии:

1. Почему вы используете n = alpha.length() и i < n вместо i < alpha.length() ?

2. Это своего рода кэшированное значение для длины строки, чтобы избежать вызова String::length на каждой итерации.

3. Используете ли вы деактивированный JIT?

4. @Tom для некоторых коллекций или аналогичных структур данных это может иметь значение, т. Е. if length() или size() и т. Д. Не являются дешевой операцией, Но вам нужно только один раз настроить шаблоны вашей IDE, Чтобы всегда использовать один и тот же шаблон.

5. Другая альтернатива: alpha.chars().allMatch(Character::isLetter) .