Java Switch-Anweisung - Ist "oder" / "und" möglich?

77

Ich habe ein Schriftsystem implementiert, das über char switch-Anweisungen herausfindet, welcher Buchstabe verwendet werden soll. In meinem Schriftbild sind nur Großbuchstaben enthalten. Ich muss es so machen, dass zum Beispiel 'a' und 'A' beide die gleiche Ausgabe haben. Anstatt doppelt so viele Fälle zu haben, könnte es sich um Folgendes handeln:

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

Ist das in Java möglich?

GlassZee
quelle
5
Ich möchte nur darauf hinweisen, dass ich die switch-Anweisung seit Ewigkeiten nicht mehr verwendet habe und fast jeden Tag Java programmiere. Der Grund ist, dass ich es als schlechten Stil empfinde, weil es eine Art Goto ist und es immer eine andere Lösung gibt, die mir besser gefällt. In Ihrem Fall könnten Sie eine Map oder eine Aufzählung (die oft ein guter Ersatz ist) mit den Methoden Boolesche Übereinstimmungen (char c) und File getImage ()
Michael Schmeißer
5
@ MichaelSchmeißer In diesem Fall möchten Sie möglicherweise auch die Verwendung von for / while-Schleifen überdenken, da es sich um eine andere Form von Goto / s handelt. Aus diesem Grund enthalten sie auch Schlüsselwörter für break / continue. In aller Ernsthaftigkeit ist 'switch' nicht goto, weil es seinen eigenen Blockbereich bietet. Es ist nur ein weiteres Tool in der Toolbox und für diesen speziellen Anwendungsfall auch am besten geeignet.
Evan Plaice

Antworten:

191

Sie können switch-case fall through verwenden, indem Sie die break;Anweisung weglassen .

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

... oder Sie können sich einfach auf Klein- oder Großbuchstaben normalisieren, bevor Sie switchfortfahren.

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;
}
Matt Ball
quelle
Ah, danke für dieses Beispiel. Ich dachte daran, die Eingabezeichenfolge in alle Großbuchstaben zu setzen, wusste aber nicht, wie möglich das ist. Vielen Dank auch für das zweite Beispiel.
GlassZee
10
Eigentlich cwürde ich das toUpperCaseInnere des Schalters stecken, wenn es nicht möglich ist, dass der Fall erhalten bleibt . Aber +1, da dies viele Zeilen unnötiger caseAussagen erspart :-)
paxdiablo
21

Oben meinst du ODER nicht UND. Beispiel für AND: 110 & 011 == 010, das ist keines der Dinge, nach denen Sie suchen.

Für OR haben Sie nur 2 Fälle ohne Pause am 1 .. Z.B:

case 'a':
case 'A':
  // do stuff
  break;
Dinah
quelle
6
Ich weiß nicht, wie hilfreich das erste Bit für das OP ist.
Matt Ball
1
@ MДΓΓБДLL: Der Kommentar zu AND zeigte, warum das OP OR statt AND will. Der OP-Teil ist derselbe wie die akzeptierte Antwort, daher hoffe ich, dass er relevant ist.
Dinah
7

Die oben genannten sind alle ausgezeichnete Antworten. Ich wollte nur hinzufügen, dass, wenn mehrere Zeichen geprüft werden müssen, ein Wenn-Sonst besser ausfallen könnte, da Sie stattdessen Folgendes schreiben könnten.

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

Wenn dies komplizierter wird, würde ich natürlich einen Regex-Matcher empfehlen.

scorpiodawg
quelle
3
== 0das ist nicht richtig. Das heißt "ist cdas erste Zeichen der Zeichenfolge?", Sie möchten wahrscheinlich entweder >= 0oder != -1.
Huon
1
@dbaupp: Ups, du hast recht. Ich dachte an compareTo () anstelle von indexOf (). Fest.
Scorpiodawg
1
Einige dieser Tests können durch vorhandene Methoden aus ersetzt werden Character, z. B. aus dem Fall "is digit".
Matt Ball
1

Soweit ich Ihre Frage verstehe, können Sie das Zeichen vor der Übergabe an die switch-Anweisung in Kleinbuchstaben konvertieren. Sie müssen sich also keine Gedanken über Großbuchstaben machen, da diese automatisch in Kleinbuchstaben umgewandelt werden. Dafür müssen Sie die folgende Funktion verwenden:

Character.toLowerCase(c);
Manan Pancholi
quelle
1

Beobachtungen an einer interessanten Switch caseFalle -> fall throughvonswitch

"Die break-Anweisungen sind notwendig, da Anweisungen in switch-Blöcken ohne sie durchfallen:" Beispiel von Java Doc

Ausschnitt aus aufeinanderfolgenden caseohne 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 für diesen Fall ist:

A

Aber wenn Sie den Wert von c ändern, dh char c = 'a';, dann wird dies interessant.

O / P für diesen Fall ist:

a A

Obwohl der zweite Falltest fehlschlägt, wird das Programm gedruckt A, da es fehlt break, wodurch switchder Rest des Codes als Block behandelt wird. Alle Anweisungen nach dem übereinstimmenden Falletikett werden nacheinander ausgeführt.

Abhijeet
quelle