Сравнение строковых целых чисел

У меня есть сканер, который считывает 7-символьный буквенно-цифровой код (вводится пользователем). переменная String называется «код».

Последний символ кода (7-й символ, 6-й индекс) ДОЛЖЕН БЫТЬ ЦИФРОВЫМ, а остальные могут быть как цифровыми, так и буквенными.

Итак, я стремился сделать улов, который останавливал бы выполнение остальной части метода, если бы последний символ в коде был чем угодно, кроме числа (от 0 до 9).

Однако мой код работает не так, как ожидалось, поскольку даже если мой код заканчивается целым числом от 0 до 9, оператор if будет выполнен и выведет «последний символ в коде не является числом).

пример кода: 45m4av7

CharacterAtEnd распечатывается как строковый символ 7, как и должно быть. однако моя программа по-прежнему говорит мне, что мой код заканчивается нечислово. Я знаю, что мои числовые значения являются строковыми символами, но это не должно иметь значения, не так ли? также я, по-видимому, не могу сравнивать фактические целые значения с «|», поэтому я использую String.valueOf и беру строковые символы 0-9.

String characterAtEnd = String.valueOf(code.charAt(code.length()-1));
System.out.println(characterAtEnd);

 if(!characterAtEnd.equals(String.valueOf(0|1|2|3|4|5|6|7|8|9))){
     System.out.println("INVALID CRC CODE: last character in code in non-numerical.");
     System.exit(0);

Я не могу в жизни понять, почему моя программа говорит мне, что мой код (с цифрой 7 в конце) заканчивается нечислово. Он должен пропустить оператор if и продолжить. правильно?


person SmashAdams    schedule 04.06.2013    source источник
comment
попробуйте использовать регулярное выражение. Ссылка   -  person SaintLike    schedule 04.06.2013
comment
Пожалуйста, пометьте свой вопрос языком программирования.   -  person Barmar    schedule 04.06.2013
comment
stackoverflow.com/questions/1223052/   -  person Prashant Kumar    schedule 04.06.2013


Ответы (2)


String contains метод будет работать здесь:

String digits = "0123456789";
digits.contains(characterAtEnd); // true if ends with digit, false otherwise

String.valueOf(0|1|2|3|4|5|6|7|8|9) на самом деле "15", что, конечно, никогда не может быть равно последнему символу. Это должно иметь смысл, потому что 0|1|2|3|4|5|6|7|8|9 оценивается как 15 с использованием целочисленной математики, которая затем преобразуется в строку.

В качестве альтернативы попробуйте следующее:

String code = "45m4av7";
char characterAtEnd = code.charAt(code.length() - 1);
System.out.println(characterAtEnd);

if(characterAtEnd < '0' || characterAtEnd > '9'){
    System.out.println("INVALID CRC CODE: last character in code in non-numerical.");
    System.exit(0);
}
person Prashant Kumar    schedule 04.06.2013
comment
можно ли сказать или в операторе if, используя целые числа? например, if(whatever.equals(1 or 2 or 3 or 4 or 5)){ тогда сделайте это; } Большое спасибо за помощь! - person SmashAdams; 04.06.2013
comment
Лингвистическое || зарезервировано для выполнения логических комбинаций логических значений. Так что вам придется идти characterAtEnd.equals("0") || characterAtEnd.equals("1") || ... - person Prashant Kumar; 04.06.2013
comment
Вот почему я выбираю логистический подход. Я создаю набор всех допустимых конечных символов и проверяю, находится ли последний символ в допустимом наборе, и возвращаю false, если это что-то еще. Он имеет логику or без явного использования or. - person Prashant Kumar; 04.06.2013
comment
Я отредактировал свой ответ, чтобы подойти к проблеме по-другому, сравнив коды ascii. Посмотри - person Prashant Kumar; 04.06.2013

Здесь вы выполняете побитовые операции: if(!characterAtEnd.equals(String.valueOf(0|1|2|3|4|5|6|7|8|9)))

Проверьте разницу между | и ||

Этот фрагмент кода должен выполнить вашу задачу с помощью регулярных выражений:

String code = "45m4av7";

if (!code.matches("^.+?\\d$")){
    System.out.println("INVALID CRC CODE");
}

Также для справки, этот метод иногда пригодится в подобных ситуациях:

/* returns true if someString actually ends with the specified suffix */
someString.endsWith(suffix);

Поскольку .endswith(suffix) не принимает регулярные выражения, если вы хотите просмотреть все возможные строчные буквы, вам нужно сделать что-то вроде этого:

/* ASCII approach */
String s = "hello";
boolean endsInLetter = false;
for (int i = 97; i <= 122; i++) {
    if (s.endsWith(String.valueOf(Character.toChars(i)))) {
        endsInLetter = true;
    }
}
System.out.println(endsInLetter);

/* String approach */
String alphabet = "abcdefghijklmnopqrstuvwxyz";
boolean endsInLetter2 = false;
for (int i = 0; i < alphabet.length(); i++) {
    if (s.endsWith(String.valueOf(alphabet.charAt(i)))) {
        endsInLetter2 = true;
    }
}
System.out.println(endsInLetter2);

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

Отходя от подхода ASCII, вы могли бы даже сделать что-то вроде этого:

Ссылка ASCII: http://www.asciitable.com/

int i = (int)code.charAt(code.length() - 1);

/* Corresponding ASCII values to digits */
if(i <= 57 && i >= 48){
    System.out.println("Last char is a digit!");
}

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

System.out.println((!code.matches("^.+?\\d$")? "Invalid CRC Code" : "Valid CRC Code"));

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

person ivan_m    schedule 04.06.2013
comment
Привет! Спасибо за ваш ответ. Я попытался использовать упомянутый вами метод .endsWith, и, похоже, он работал хорошо. Меня беспокоит только то, что мне кажется, что мне нужно повторно вставить строку кода 26 раз для каждой буквы алфавита. Принимая во внимание, что я действительно хотел бы иметь возможность сказать, заканчивается ли код на a или b или c или d... и т. д., а затем напечатать неверный код. Так что я мог бы иметь все это хорошо в одном операторе if. это возможно? Кроме того, мне было интересно, если для метода .matches он смотрит на то, что представляют собой элементы в скобках по отдельности или в целом? - person SmashAdams; 04.06.2013
comment
К сожалению, endwith(suffix) не принимает регулярные выражения (насколько мне известно), и если вы хотите проверить каждую букву алфавита, вы можете использовать цикл (хотя это будет неуклюже). Что касается метода .matches, он просматривает последний элемент, чтобы убедиться, что он десятичный. Я изменил свое сообщение, чтобы помочь вам =) Удачи! - person ivan_m; 04.06.2013