如何在 Java 中比较字符和数字



我遇到了一个问题,我认为这是在比较字符和数字。

String FindCountry = "BB";
Map<String, String> Cont = new HashMap <> ();
Cont.put("BA-BE", "Angola");
Cont.put("9X-92", "Trinidad & Tobago");

for ( String key : Cont.keySet()) {
  if (key.charAt(0) == FindCountry.charAt(0) && FindCountry.charAt(1) >= key.charAt(1) && FindCountry.charAt(1) <= key.charAt(4)) {
    System.out.println("Country: "+ Cont.get(key));
  }
}

在这种情况下,代码打印"安哥拉",但如果

String FindCountry = "9Z" 

它不打印任何内容。我不确定我认为问题在于它无法比较"2"大于"Z"。在那个例子中,我只得到了两个 Cont.put((,但在我的文件中,我得到了更多,而且其中很多不仅带有字符。我和他们有问题。

将字符与数字进行比较的最聪明和最好的方法是什么?实际上,如果我设置一个像"1"大于"Z"这样的规则,那就没问题了,因为我需要这种更大的方式:A-Z-9-0。

谢谢!

您可以使用

查找"表",我使用了String

private static final String LOOKUP = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

然后将字符与indexOf()进行比较,但它似乎很混乱,可能更容易实现,我目前想不出更简单的东西:

String FindCountry = "9Z";
Map<String, String> Cont = new HashMap<>();
Cont.put("BA-BE", "Angola");
Cont.put("9X-92", "Trinidad & Tobago");
for (String key : Cont.keySet()) {
    if (LOOKUP.indexOf(key.charAt(0)) == LOOKUP.indexOf(FindCountry.charAt(0)) &&
        LOOKUP.indexOf(FindCountry.charAt(1)) >= LOOKUP.indexOf(key.charAt(1)) &&
        LOOKUP.indexOf(FindCountry.charAt(1)) <= LOOKUP.indexOf(key.charAt(4))) {
        System.out.println("Country: " + Cont.get(key));
    }
}

如果您只使用字符A-Z0-9,则可以在两者之间添加一个转换方法,该方法将增加0-9字符的值,以便它们在A-Z之后:

int applyCharOrder(char c){
  // If the character is a digit:
  if(c < 58){
    // Add 43 to put it after the 'Z' in terms of decimal unicode value:
    return c + 43;
  }
  // If it's an uppercase letter instead: simply return it as is
  return c;
}

可以这样使用:

if(applyCharOrder(key.charAt(0)) == applyCharOrder(findCountry.charAt(0))
    && applyCharOrder(findCountry.charAt(1)) >= applyCharOrder(key.charAt(1))
    && applyCharOrder(findCountry.charAt(1)) <= applyCharOrder(key.charAt(4))){
  System.out.println("Country: "+ cont.get(key));
}

在线试用。

注意:这是一个包含十进制 unicode 值的表格。字符'0'-'9'将具有48-57的值,'A'-'Z'将具有65-90的值。因此,< 58用于检查它是否是数字字符,+ 43将增加48-57 91-100,将它们的值放在'A'-'Z'上方,以便您的<=>=检查将按您希望的方式工作。


或者,您可以创建一个查找字符串并将其索引用于订单:

int applyCharOrder(char c){
  return "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".indexOf(c);
}

在线试用。

PS:正如@Stultuske的第一条评论中提到的,变量通常在camelCase中,因此它们不以大写字母开头。

正如其他人在评论中所说,对字符的这种数学比较操作是基于每个字符的实际 ASCII 值。所以我建议你使用 ASCII 表作为参考来重构你的逻辑。

相关内容

  • 没有找到相关文章

最新更新