Заявление о переключении Java - возможно ли "или"/"и"?
Я реализовал систему шрифтов, которая узнает, какую букву использовать с помощью операторов переключения символов. В моем изображении шрифта только заглавные буквы. Мне нужно сделать так, чтобы, например, "a" и "A" оба имели одинаковый вывод. Вместо двухкратного количества дел, это может быть что-то вроде следующего:
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?
6 ответов
Вы можете использовать распределительный шкаф, опуская 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;
}
Выше вы имеете в виду ИЛИ, а не И. Пример AND: 110 & 011 == 010 - это не то, что вы ищете.
Для ИЛИ просто 2 случая без перерыва на 1-й. Например:
case 'a':
case 'A':
// do stuff
break;
Выше приведены все отличные ответы. Я просто хотел добавить, что если есть несколько символов для проверки, то 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 ("!@#$%,.".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
}
Конечно, если это станет еще сложнее, я бы порекомендовал регулярное выражение.
Расширенный синтаксис переключателя/кейса / переключателя со стрелками (начиная с Java 13):
char c;
switch (c) {
case 'A', 'a' -> {} // c is either 'A' or 'a'.
case ...
}
Наблюдения за интересным Switch case
ловушка -> fall through
из 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
Но если вы измените значение с, т.е. char c = 'a';
, тогда это получится интересным.
O / P для этого случая:
a
A
Несмотря на то, что второй тест не пройден, программа выходит на печать A
из-за отсутствия break
что приводит к switch
рассматривать остальную часть кода как блок. Все операторы после соответствующей метки регистра выполняются последовательно.
Из того, что я понимаю по вашему вопросу, перед передачей символа в оператор switch вы можете преобразовать его в нижний регистр. Таким образом, вам не нужно беспокоиться о верхнем регистре, потому что они автоматически преобразуются в нижний регистр. Для этого вам нужно использовать следующую функцию:
Character.toLowerCase(c);