Java Switch Statement - Is "или" / "и" возможно?
Я реализовал систему шрифтов, которая обнаруживает, какую букву использовать с помощью операторов switch char. В моем изображении шрифта есть только заглавные буквы. Мне нужно сделать так, чтобы, например, "a" и "A" имели одинаковый результат. Вместо того, чтобы иметь 2x количество случаев, могло бы быть что-то вроде следующего:
char c;
switch(c){
case 'a' & 'A': /*get the 'A' image*/; break;
case 'b' & 'B': /*get the 'B' image*/; break;
...
case 'z' & 'Z': /*get the 'Z' image*/; break;
}
Возможно ли это в java?
Ответы
Ответ 1
Вы можете использовать сброс case-switch, опуская оператор break;
.
char c = /* whatever */;
switch(c) {
case 'a':
case 'A':
//get the 'A' image;
break;
case 'b':
case 'B':
//get the 'B' image;
break;
// (...)
case 'z':
case 'Z':
//get the 'Z' image;
break;
}
... или вы можете нормально нормализовать нижний регистр или верхний регистр до switch
ing.
char c = Character.toUpperCase(/* whatever */);
switch(c) {
case 'A':
//get the 'A' image;
break;
case 'B':
//get the 'B' image;
break;
// (...)
case 'Z':
//get the 'Z' image;
break;
}
Ответ 2
Вы имеете в виду OR, а не AND. Пример AND: 110 и 011 == 010, который не является ни тем, что вы ищете.
Для OR, только 2 случая без перерыва на 1-й. Например:
case 'a':
case 'A':
// do stuff
break;
Ответ 3
Выше все это отличные ответы. Я просто хотел добавить, что, когда есть несколько символов для проверки, if-else может получиться лучше, поскольку вы могли бы написать следующее.
// switch on vowels, digits, punctuation, or consonants
char c; // assign some character to 'c'
if ("aeiouAEIOU".indexOf(c) != -1) {
// handle vowel case
} else if ("[email protected]#$%,.".indexOf(c) != -1) {
// handle punctuation case
} else if ("0123456789".indexOf(c) != -1) {
// handle digit case
} else {
// handle consonant case, assuming other characters are not possible
}
Конечно, если это усложняется, я рекомендую использовать регулярное выражение.
Ответ 4
Из того, что я понимаю о вашем вопросе, перед передачей символа в оператор switch вы можете преобразовать его в нижний регистр. Поэтому вам не нужно беспокоиться о верхних случаях, потому что они автоматически преобразуются в нижний регистр.
Для этого вам нужно использовать следующую функцию:
Character.toLowerCase(c);
Ответ 5
Наблюдения в интересной ловушке Switch case
→ fall through
of switch
"Операторы break необходимы, потому что без них утверждения в блоках переключателей проваливаются:"
Пример Java Doc
Фрагмент последовательного case
без break
:
char c = 'A';/* switch with lower case */;
switch(c) {
case 'a':
System.out.println("a");
case 'A':
System.out.println("A");
break;
}
O/P для этого случая:
A
Но если вы измените значение c, т.е. char c = 'a';
, тогда это станет интересным.
O/P для этого случая:
a
A
Несмотря на то, что тест 2-го случая завершился неудачно, программа переходит на печать A
из-за отсутствия break
, что приводит к тому, что switch
обрабатывает остальную часть кода как блок. Все операторы после метки соответствия выполняются в последовательности.