在 Java 中比较字符

我想检查一个字符变量是21个特定字符之一,什么是最短的方法我可以做到这一点?

例如:

if(symbol == ('A'|'B'|'C')){}

好像不管用,我需要这样写吗:

if(symbol == 'A' || symbol == 'B' etc.)
556157 次浏览

如果您的输入是一个字符,并且您正在检查的字符大多是连续的,您可以尝试这样做:

if ((symbol >= 'A' && symbol <= 'Z') || symbol == '?') {
// ...
}

然而,如果你的输入是一个字符串,一个更紧凑的方法(但是更慢)是使用一个带有字符类的正则表达式:

if (symbol.matches("[A-Z?]")) {
// ...
}

如果你有一个字符,你首先需要把它转换成一个字符串,然后才能使用正则表达式:

if (Character.toString(symbol).matches("[A-Z?]")) {
// ...
}

是的,你需要把它写成你的第二行。Java 没有第一行的 Python 风格的语法代码。

或者,您可以将有效值放入数组中,并检查数组中是否存在 symbol

因为我没有 java sdk:

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


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

选项2将工作。您也可以使用 Set<Character>

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

你得到的第一个声明可能不是你想要的... ... abc0实际上是在做位操作:)

您的第二个陈述是正确的,但是您将有21个 OR。

如果21个字符是“连续的”,那么上述解决方案是可行的。

如果没有,您可以预先计算有效字符的哈希集,然后执行类似

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

它可能更清楚地写作为一个开关声明秋季通过例如。

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

使用 番石榴:

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...");

如果你提前知道所有的21个字符,你可以把它们写成一个字符串,然后像这样检查:

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

我觉得这是最近的路。

如果你有特定的字符应该是:

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

你可以把你的字符写成字符串,然后使用 equals 方法。

例如:

String firstChar = "A";
String secondChar = "B";
String thirdChar = "C";


if (firstChar.equalsIgnoreCase(secondChar) ||
(firstChar.equalsIgnoreCase(thirdChar))) // As many equals as you want
{
System.out.println(firstChar + " is the same as " + secondChar);
} else {
System.out.println(firstChar + " is different than " + secondChar);
}

你可以用这个:

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

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

使用 中使用过载的方便工厂方法构造的 List<Character>实现这一点的一种方法是:

if(List.of('A','B','C','D','E').contains(symbol) {
// do something
}

可以使用 IndexOf (char)方法轻松地解决这个问题,如果字符不在 String 中,则返回 -1。

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