Я хочу проверить, что переменная типа char - это один из 21 символов, какой самый короткий способ сделать это?
Например:
if(symbol == ('A'|'B'|'C')){}
Кажется, не работает. Нужно ли писать так:
if(symbol == 'A' || symbol == 'B' etc.)
Я хочу проверить, что переменная типа char - это один из 21 символов, какой самый короткий способ сделать это?
Например:
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;
Я думаю, что это самый короткий путь.
Первое, что у вас есть, вероятно, не то, что вы хотите... 'A'|'B'|'C'
на самом деле выполняет побитовую операцию:)
Ваше второе утверждение верно, но у вас будет 21 OR.
Если 21 символ является "последовательным", то вышеупомянутые решения в порядке.
Если вы не можете предварительно вычислить хэш-набор допустимых символов и сделать что-то вроде
if (validCharHashSet.contains(symbol))...
Это может быть яснее написано как оператор 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) { ... }
вы можете использовать это:
if ("ABCDEFGHIJKLMNOPQRSTUVWXYZ".contains(String.valueOf(yourChar)))
обратите внимание, что вам не нужно создавать отдельную строку с буквами A-Z.
Да, вам нужно написать его, как свою вторую строку. Java не имеет синтаксического сахара стиля питона в вашей первой строке.
В качестве альтернативы вы можете поместить свои допустимые значения в массив и проверить наличие symbol
в массиве.
псевдокод, поскольку у меня нет java sdk для меня:
Char candidates = new Char[] { 'A', 'B', ... 'G' };
foreach(Char c in candidates)
{
if (symbol == c) { return true; }
}
return false;
Вы можете просто написать свои символы как строки и использовать метод 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);
}
Один из способов сделать это с помощью List<Character>
, построенного с использованием перегруженных методов удобства factory в java9:
if(List.of('A','B','C','D','E').contains(symbol) {
// do something
}