Заява про перемикання Java - чи можливо “або” / “та”?


77

Я впровадив систему шрифтів, яка з’ясовує, яку букву використовувати за допомогою операторів char switch. На моєму зображенні шрифту є лише великі літери. Мені потрібно зробити так, щоб, наприклад, "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
Я просто хочу зазначити, що я не використовував оператор switch протягом століть, і я програмую Java майже кожен день. Причина полягає в тому, що я вважаю це поганим стилем, оскільки це свого роду гото, і завжди є інше рішення, яке мені більше подобається. У вашому випадку ви можете скористатися Map або enum (що часто є гарною заміною) із методами boolean
match

5
@ MichaelSchmeißer У цьому випадку, можливо, ви також захочете переглянути цикли for / while, оскільки це інша форма Goto / s. Ось чому вони також містять ключові слова break / continue. Насправді, "перемикач" не є goto, оскільки він забезпечує власну область дії блоку. Це просто ще один інструмент у наборі інструментів, і для цього конкретного випадку він також є найбільш підходящим.
Еван Плейс,

Відповіді:


192

Ви можете скористатися випадком перемикання комутатора, пропустивши 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введенням.

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;
}

Ах, дякую за цей приклад. Раніше я думав зробити вхідний рядок у всі великі літери, але не знав, наскільки це можливо, тому дякую і за другий приклад.
GlassZee

10
Насправді, якби не випадково cпотрібно було зберегти випадок , я б поставив toUpperCaseвсередині перемикач. Але +1, оскільки це економить багато рядків непотрібних caseвисловлювань :-)
paxdiablo

21

Вище, ви маєте на увазі АБІ ні, І. Приклад AND: 110 & 011 == 010, що не є тим, що ви шукаєте.

Для АБО просто 2 справи без перерви 1-го. Наприклад:

case 'a':
case 'A':
  // do stuff
  break;

6
Я не знаю, наскільки цей перший біт корисний для ОП.
Matt Ball

1
@ MДΓΓБДLL: Коментар до І показував, чому ОП хоче АБО, а не І. Частина АБО є такою ж, як прийнята відповідь, тому, сподіваюся, вона актуальна.
Dinah

7

Вищевказані всі чудові відповіді. Я просто хотів додати, що коли є кілька символів для перевірки, 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
}

Звичайно, якщо це ускладниться, я б рекомендував відповідність регулярних виразів.


3
== 0неправильно. Тобто кажучи "це cперший символ рядка?", Ви, напевно, хочете або, >= 0або != -1.
huon

1
@dbaupp: ой, ти маєш рацію. Я думав порівнятиTo () замість indexOf (). Виправлено.
scorpiodawg

1
Деякі з цих тестів можна замінити існуючими методами Character, наприклад, "це цифра".
Matt Ball

1

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

Character.toLowerCase(c);

1

Спостереження за цікавою 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до того, що решта коду трактується як блок. Усі оператори після відповідного ярлика регістру виконуються послідовно.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.