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

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

50 голосов
/ 17 февраля 2011

Прошло много времени с тех пор, как я создал любую Java, поэтому мой синтаксис на данный момент не самый лучший.

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

Например:

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

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

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

Ответы [ 12 ]

70 голосов
/ 18 февраля 2011

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

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

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

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

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

if (Character.toString(symbol).matches("[A-Z?]")) {
    // ...
}
11 голосов
/ 18 февраля 2011

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

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

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

6 голосов
/ 18 февраля 2011

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

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

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

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

if (validCharHashSet.contains(symbol))...
3 голосов
/ 18 февраля 2011

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

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           
3 голосов
/ 18 февраля 2011

Может быть понятнее записать в виде оператора switch с падением, например,

switch (symbol){
    case 'A':
    case 'B':
      // Do stuff
      break;
     default:
}
2 голосов
/ 18 февраля 2011

Использование Гуава :

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 голос
/ 16 октября 2015

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

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

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

1 голос
/ 18 февраля 2011

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

char[] myCharSet = new char[] {'A', 'B', 'C', ...};
Arrays.sort(myCharSet);
if (Arrays.binarySearch(myCharSet, symbol) >= 0) { ... }
0 голосов
/ 28 сентября 2017

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

if(List.of('A','B','C','D','E').contains(symbol) {
    // do something
}
0 голосов
/ 17 ноября 2014

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