Подтвердить что ты не робот

Сравнение символов в Java

Я хочу проверить, что переменная типа char - это один из 21 символов, какой самый короткий способ сделать это?

Например:

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

Кажется, не работает. Нужно ли писать так:

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

Ответ 1

Если ваш ввод является символом, а символы, которые вы проверяете, в основном последовательны, вы можете попробовать следующее:

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

Однако, если ваш ввод является строкой, более компактный подход (но медленнее) заключается в использовании регулярного выражения с классом символов:

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

Если у вас есть символ, вам сначала нужно будет преобразовать его в строку, прежде чем вы сможете использовать регулярное выражение:

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

Ответ 2

Если вы знаете все свои 21 персонажа заранее, вы можете записать их как одну строку, а затем проверить ее следующим образом:

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

Я думаю, что это самый короткий путь.

Ответ 3

Первое, что у вас есть, вероятно, не то, что вы хотите... 'A'|'B'|'C' на самом деле выполняет побитовую операцию:)

Ваше второе утверждение верно, но у вас будет 21 OR.

Если 21 символ является "последовательным", то вышеупомянутые решения в порядке.

Если вы не можете предварительно вычислить хэш-набор допустимых символов и сделать что-то вроде

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

Ответ 4

Это может быть яснее написано как оператор switch с падением через, например,

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

Ответ 5

Если у вас есть определенные символы:

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           

Ответ 6

Используя 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...");

Ответ 7

Вариант 2 будет работать. Вы также можете использовать Set<Character> или

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

Ответ 8

вы можете использовать это:

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

обратите внимание, что вам не нужно создавать отдельную строку с буквами A-Z.

Ответ 9

Да, вам нужно написать его, как свою вторую строку. Java не имеет синтаксического сахара стиля питона в вашей первой строке.

В качестве альтернативы вы можете поместить свои допустимые значения в массив и проверить наличие symbol в массиве.

Ответ 10

псевдокод, поскольку у меня нет java sdk для меня:

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

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

Ответ 11

Вы можете просто написать свои символы как строки и использовать метод 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);
    }

Ответ 12

Один из способов сделать это с помощью List<Character>, построенного с использованием перегруженных методов удобства factory в :

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