0

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 ステートメントをスキップして続行する必要があります。右?

4

2 に答える 2

0

この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 に変換されるため、これは理にかなっています。

または、これを試してください:

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);
}
于 2013-06-04T00:34:32.920 に答える
0

ここでビット単位の操作を行っています: 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"));

これが役立つことを願っています!

于 2013-06-04T00:48:00.053 に答える