Заявление о переключении Java - возможно "или" / "и" возможно? - PullRequest
68 голосов
/ 27 марта 2012

Я реализовал систему шрифтов, которая узнает, какую букву использовать с помощью операторов переключения символов. В моем изображении шрифта только заглавные буквы. Мне нужно сделать так, чтобы, например, «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?

Ответы [ 5 ]

175 голосов
/ 27 марта 2012

Вы можете использовать переключение случая переключения, пропустив оператор 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;
}
18 голосов
/ 27 марта 2012

Выше вы имеете в виду ИЛИ, а не И. Пример AND: 110 & 011 == 010, который не является ни тем, что вы ищете.

Для ИЛИ просто 2 случая без перерыва на 1-й. Например:

case 'a':
case 'A':
  // do stuff
  break;
7 голосов
/ 27 марта 2012

Выше приведены все отличные ответы. Я просто хотел добавить, что если есть несколько символов для проверки, то 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
}

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

1 голос
/ 25 февраля 2016

Наблюдения за интересной 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

Но если вы измените значение c, то есть char c = 'a';, тогда это будет интересно.

O / P для этого случая:

a A

Несмотря на то, что второй тест не пройден, программа отправляет на печать A из-за отсутствия break, из-за которого switch обрабатывает остальную часть кода как блок. Все операторы после соответствующей метки регистра выполняются последовательно.

1 голос
/ 27 марта 2012

Из того, что я понимаю по вашему вопросу, перед передачей символа в оператор switch вы можете преобразовать его в нижний регистр. Таким образом, вам не нужно беспокоиться о верхнем регистре, потому что они автоматически преобразуются в нижний регистр. Для этого вам нужно использовать следующую функцию:

Character.toLowerCase(c);
...