我想检查一个字符变量是否是21个特定字符之一,有什么最短的方法可以实现吗?
例如:
例如:
if(symbol == ('A'|'B'|'C')){}
看起来好像没生效。我需要像下面这样写吗:
if(symbol == 'A' || symbol == 'B' etc.)
if(symbol == ('A'|'B'|'C')){}
看起来好像没生效。我需要像下面这样写吗:
if(symbol == 'A' || symbol == 'B' etc.)
如果您的输入是一个字符,而您要检查的字符大多是连续的,您可以尝试这个方法:
if ((symbol >= 'A' && symbol <= 'Z') || symbol == '?') {
// ...
}
然而,如果您的输入是字符串,则使用带有字符类的正则表达式会更加简洁(但速度较慢):if (symbol.matches("[A-Z?]")) {
// ...
}
如果你有一个字符,你需要先将其转换为字符串,然后才能使用正则表达式:if (Character.toString(symbol).matches("[A-Z?]")) {
// ...
}
如果您已经事先知道了所有21个字符,那么您可以将它们全部写成一个字符串,然后像这样检查:
char wanted = 'x';
String candidates = "abcdefghij...";
boolean hit = candidates.indexOf(wanted) >= 0;
我认为这是最简单的方法。
您可以使用这个:
if ("ABCDEFGHIJKLMNOPQRSTUVWXYZ".contains(String.valueOf(yourChar)))
你第一个语句可能不是你想要的...'A'|'B'|'C'
实际上正在进行位运算 :)
你的第二个语句是正确的,但你会有21个OR。
如果这21个字符是"连续的",那么上面的解决方案就可以了。
如果不是,你可以预先计算一个有效字符的哈希集合,然后做类似于
if (validCharHashSet.contains(symbol))...
可以使用带有"fall through"的switch语句来更清晰地表达,例如:
switch (symbol){
case 'A':
case 'B':
// Do stuff
break;
default:
}
如果您有特定的字符需求:
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
使用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...");
选项2可行。您还可以使用Set<Character>
或
char[] myCharSet = new char[] {'A', 'B', 'C', ...};
Arrays.sort(myCharSet);
if (Arrays.binarySearch(myCharSet, symbol) >= 0) { ... }
您可以通过使用String.indexOf(char)方法轻松解决此问题,如果字符不在字符串中,则该方法返回-1。
String candidates = "ABCDEFGHIJK";
if(candidates.indexOf(symbol) != -1){
//character in list of candidates
}
因为我手头没有Java SDK,所以使用伪代码:
Char candidates = new Char[] { 'A', 'B', ... 'G' };
foreach(Char c in candidates)
{
if (symbol == c) { return true; }
}
return false;