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

时间:2019-02-05 12:57:30

标签: java string numbers int compare

我遇到了一个问题,我认为这是将char与数字进行比较。

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" 

它不打印任何内容。我不确定问题是否在于无法比较“ Z”比“ 2”大。在该示例中,我只有两个Cont.put(),但是在我的文件中,我得到了更多,而且很多不仅包含char。我对他们有问题。

将char与数字进行比较的最聪明,最好的方法是什么?实际上,如果我将“ 1”设置为大于“ Z”,则可以,因为我需要这种更大的方式:A-Z-9-0。

谢谢!

3 个答案:

答案 0 :(得分:2)

您可以使用查找“表”,我使用了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));
    }
}

答案 1 :(得分:1)

如果仅使用字符A-Z0-9,则可以添加一种转换方法,在这两种转换方法之间将增加0-9个字符的值,使它们位于{{之后1}}:

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

Try it online.

注意:Here is a table with the decimal unicode values.字符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)); } 将具有值'0'-'9',而48-57将具有值'A'-'Z'。因此,65-90用于检查它是否是数字字符,而< 58会将+ 43增加到48-57,并将其值放在91-100之上因此您的'A'-'Z'<=支票将按您希望的那样工作。


或者,您可以创建一个查询字符串,并将其索引用于该顺序:

>=

Try it online.

PS:如the first comment by @Stultuske中所述,变量通常位于camelCase中,因此它们不是以大写字母开头。

答案 2 :(得分:-1)

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