Проблем със сравняване на низови цели числа

Имам скенер, който чете буквено-цифров код от 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
опитайте да използвате regex. Връзка   -  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 или 2 или 3 или 4 или 5)){ тогава направете това; } Благодаря ви много за помощта! - person SmashAdams; 04.06.2013
comment
Езиковият || е запазен за извършване на логически комбинации от булеви стойности. Така че ще трябва да отидете characterAtEnd.equals("0") || characterAtEnd.equals("1") || ... - person Prashant Kumar; 04.06.2013
comment
Ето защо предпочитам логистичния подход. Създавам набор от всички приети крайни знаци и проверявам дали последният знак е в приемливия набор и връщам false, ако е нещо друго. Има 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
За съжаление endswith(suffix) не приема регулярни изрази (доколкото ми е известно) и ако искате да проверите за всяка буква от азбуката, можете да използвате цикъл (въпреки че би било тромаво). Що се отнася до метода .matches, той разглежда последния елемент, за да се увери, че е десетичен знак. Промених публикацията си, за да ви помогна =) Успех! - person ivan_m; 04.06.2013