#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)
.