在Java中比较字符

74
我想检查一个字符变量是否是21个特定字符之一,有什么最短的方法可以实现吗?
例如:
if(symbol == ('A'|'B'|'C')){}

看起来好像没生效。我需要像下面这样写吗:

if(symbol == 'A' || symbol == 'B' etc.)

是的,那是一种方法。请查看正则表达式 - asgs
13个回答

87

如果您的输入是一个字符,而您要检查的字符大多是连续的,您可以尝试这个方法:

if ((symbol >= 'A' && symbol <= 'Z') || symbol == '?') {
    // ...
}
然而,如果您的输入是字符串,则使用带有字符类的正则表达式会更加简洁(但速度较慢):
if (symbol.matches("[A-Z?]")) {
    // ...
}
如果你有一个字符,你需要先将其转换为字符串,然后才能使用正则表达式:
if (Character.toString(symbol).matches("[A-Z?]")) {
    // ...
}

+1 如果21个符号大部分是连续的,这就是我会这样做的方法。 - Endophage
谢谢Mark,我以前用过正则表达式,但从未在Java中使用过,甚至不知道可以这样做! - Alex
Oracle文档总结了答案并提供了上述答案的缺陷,因此请查看。https://docs.oracle.com/javase/tutorial/i18n/text/charintro.html。 - Saurabh Gupta

17

如果您已经事先知道了所有21个字符,那么您可以将它们全部写成一个字符串,然后像这样检查:

char wanted = 'x';
String candidates = "abcdefghij...";
boolean hit = candidates.indexOf(wanted) >= 0;

我认为这是最简单的方法。


非常优雅的解决方案。恭喜。 - Draško

7

您可以使用这个:

if ("ABCDEFGHIJKLMNOPQRSTUVWXYZ".contains(String.valueOf(yourChar)))

请注意,您不需要创建一个与字母A-Z分开的单独字符串。

6

你第一个语句可能不是你想要的...'A'|'B'|'C'实际上正在进行位运算 :)

你的第二个语句是正确的,但你会有21个OR。

如果这21个字符是"连续的",那么上面的解决方案就可以了。

如果不是,你可以预先计算一个有效字符的哈希集合,然后做类似于

if (validCharHashSet.contains(symbol))...

5

可以使用带有"fall through"的switch语句来更清晰地表达,例如:

switch (symbol){
    case 'A':
    case 'B':
      // Do stuff
      break;
     default:
}

3

如果您有特定的字符需求:

Collection<Character> specificChars = Arrays.asList('A', 'D', 'E');  // more chars
char symbol = 'Y';
System.out.println(specificChars.contains(symbol));   // false
symbol = 'A';
System.out.println(specificChars.contains(symbol));   // true           

+1 对于完全有效的替代方法,这可能对于大量字符来说更好。 - DJClayworth

2

使用Guava

if (CharMatcher.anyOf("ABC...").matches(symbol)) { ... }

如果许多字符是一个范围,例如"A"到"U",但有一些不是:

CharMatcher.inRange('A', 'U').or(CharMatcher.anyOf("1379"))

您也可以将其声明为static final字段,以便不必每次创建匹配器。
private static final CharMatcher MATCHER = CharMatcher.anyOf("ABC...");

1

选项2可行。您还可以使用Set<Character>

char[] myCharSet = new char[] {'A', 'B', 'C', ...};
Arrays.sort(myCharSet);
if (Arrays.binarySearch(myCharSet, symbol) >= 0) { ... }

1

您可以通过使用String.indexOf(char)方法轻松解决此问题,如果字符不在字符串中,则该方法返回-1。

String candidates = "ABCDEFGHIJK";
if(candidates.indexOf(symbol) != -1){
    //character in list of candidates
}

0

因为我手头没有Java SDK,所以使用伪代码:

Char candidates = new Char[] { 'A', 'B', ... 'G' };

foreach(Char c in candidates)
{
    if (symbol == c) { return true; }
}
return false;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接