如何将 char 与 Java 中的数字进行比较

How to compare char with number in 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));

  }
}

在这种情况下,代码打印 "Angola",但如果

String FindCountry = "9Z" 

它不打印任何东西。我不确定我认为问题在于它无法比较大于 'Z' 的“2”。在那个例子中,我只有两个 Cont.put(),但在我的文件中,我得到了更多,其中很多不仅仅是字符。我遇到了问题。

比较 char 和数字的最聪明和最好的方法是什么?实际上,如果我设置像“1”这样的规则大于 "Z" 就可以了,因为我需要这种更大的方式:A-Z-9-0.

谢谢!

你可以使用查找"table",我使用了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));
    }
}

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

如果你只使用字符 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));
}

Try it online.

注意:Here is a table with the decimal unicode values. 个字符 '0'-'9' 将具有值 48-57'A'-'Z' 将具有值 65-90。所以 < 58 用于检查它是否是数字字符,而 + 43 会将 48-57 增加到 91-100,将它们的值放在 'A'-'Z' 之上所以你的 <=>= 检查将按照你希望的方式工作。


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

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

Try it online.

PS:如中所述,变量通常采用驼峰式命名,因此它们不是以大写字母开头。