【问题标题】:Comparing String Integers Issue比较字符串整数问题
【发布时间】:2013-05-30 06:20:41
【问题描述】:

我有一台可以读取 7 个字符的字母数字代码(由用户输入)的扫描仪。字符串变量称为“代码”。

代码的最后一个字符(第 7 个字符,第 6 个索引)必须是数字,其余的可以是数字或字母。

所以,我试图做一个 catch,如果代码中的最后一个字符不是数字(从 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 语句并继续。对吧?

【问题讨论】:

标签: java numbers integer comparison


【解决方案1】:

Stringcontains 方法可以在这里工作:

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);
}

【讨论】:

  • 是否可以在使用整数的 if 语句中说“或”?像 if(whatever.equals(1 or 2 or 3 or 4 or 5)){ 然后这样做; } 非常感谢您的帮助!
  • 语言 || 保留用于进行布尔值的逻辑组合。所以你必须去characterAtEnd.equals("0") || characterAtEnd.equals("1") || ...
  • 这就是我选择逻辑或方法的原因。我创建了所有可接受的结束字符的集合,并检查最后一个字符是否在可接受的集合中,如果是其他字符则返回 false。它具有或逻辑,没有明确使用或。
  • 我已经编辑了我的答案,通过比较 ascii 代码以另一种方式解决问题。看看
【解决方案2】:

您在这里进行按位运算: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"));

我希望这会有所帮助!

【讨论】:

  • 嗨!感谢您的答复。我尝试使用您提到的 .endsWith 方法,它似乎运行良好。我唯一担心的是,似乎我需要为字母表中的每个字母重新粘贴代码行 26 次。而我真的很想能够说“如果代码以 a 或 b 或 c 或 d ......等结尾,然后打印“无效代码”。所以我可以在一个 if 语句中得到很好的结果。这可能吗? ,我想知道对于 .matches 方法,如果它查看括号中的项目是单独的还是整体的?
  • 不幸的是,endswith(suffix) 不采用正则表达式(据我所知),如果您想检查字母表中的每个字母,您可以使用循环(虽然它会很笨重)。就 .matches 方法而言,它会查看最后一项以确保它是小数。我已经修改了我的帖子来帮助你 =) 祝你好运!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-04
  • 2017-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多