web-dev-qa-db-ja.com

Java Switchステートメント-「or」/「and」は可能ですか?

Char switchステートメントを使用してどの文字を使用するかを見つけるフォントシステムを実装しました。フォント画像には大文字しかありません。たとえば、「a」と「A」の両方が同じ出力になるようにする必要があります。ケースの数を2倍にする代わりに、次のようなものにすることができます。

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で可能ですか?

69
GlassZee

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

...または、switchingの前に 小文字 または 大文字 に正規化できます。

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;
}
180
Matt Ball

上記の意味は、OR notAND。ANDの例:110&011 == 010は、どちらも探しているものではありません。

ORの場合、1日の休憩なしで2つのケースがあります。例えば:

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

上記はすべて優れた答えです。チェックする文字が複数ある場合、代わりに次のように書くことができるので、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
}

もちろん、これがさらに複雑になる場合は、正規表現マッチャーをお勧めします。

7
scorpiodawg

興味深いSwitch caseトラップ-> fall through of switch

"breakステートメントが必要です。それらがないと、switchブロック内のステートメントが通過するためです:"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がコードの残りをブロックとして処理するため、print switchに進みます。一致するcaseラベルの後のすべてのステートメントは順番に実行されます。

1
Abhijeet

あなたの質問について私が理解したことから、文字をswitch文に渡す前に、小文字に変換できます。したがって、大文字は自動的に小文字に変換されるため、大文字について心配する必要はありません。そのためには、以下の機能を使用する必要があります。

Character.toLowerCase(c);
1
Manan Pancholi