如何将 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-Z
和 0-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));
}
注意: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);
}
PS:如中所述,变量通常采用驼峰式命名,因此它们不是以大写字母开头。
我遇到了一个问题,我想是在比较一个字符和一个数字时。
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-Z
和 0-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));
}
注意: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);
}
PS:如