web-dev-qa-db-fra.com

Java Instruction Switch - Est-ce que "ou" / "et" est possible?

J'ai mis en place un système de polices qui détermine quelle lettre utiliser via les instructions de changement de caractère. Il n'y a que des lettres majuscules dans mon image de police. Je dois faire en sorte que, par exemple, "a" et "A" produisent le même résultat. Au lieu d'avoir deux fois plus de cas, cela pourrait-il ressembler à ceci:

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

Est-ce possible en Java?

69
GlassZee

Vous pouvez utiliser l’option switch-case fall en omettant le break; déclaration.

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

... ou vous pouvez simplement normaliser à minuscule ou majuscule avant 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

Ci-dessus, vous voulez dire OR pas AND. Exemple de AND: 110 & 011 == 010 qui n’est ni l’une des choses que vous recherchez.

Pour OR, il suffit d’avoir 2 cas sans pause le 1er. Par exemple:

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

Les réponses ci-dessus sont toutes d'excellentes réponses. Je voulais juste ajouter que quand il y a plusieurs personnages avec lesquels vérifier, un if-else pourrait être meilleur puisque vous pourriez plutôt écrire ce qui suit.

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

Bien sûr, si cela devient plus compliqué, je recommanderais un matcher regex.

7
scorpiodawg

Observations sur un intéressant Switch case piège -> fall through de switch

"Les instructions de séparation sont nécessaires car sans elles, les instructions des blocs de commutation tombent:" exemple de Java Doc

Extrait de case consécutif sans 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 pour ce cas est:

A

Mais si vous changez la valeur de c, c.-à-d., char c = 'a';, alors cela devient intéressant.

O/P pour ce cas est:

a A

Même si le deuxième test de cas échoue, le programme passe à print A en raison de l'absence de break, ce qui fait que switch traite le reste du code comme un bloc. Toutes les instructions qui suivent le libellé de casse correspondant sont exécutées en séquence.

1
Abhijeet

D'après ce que j'ai compris de votre question, avant de passer le caractère à l'instruction switch, vous pouvez le convertir en minuscule. Ainsi, vous n'avez pas à vous soucier des majuscules car elles sont automatiquement converties en minuscules. Pour cela, vous devez utiliser la fonction ci-dessous:

Character.toLowerCase(c);
1
Manan Pancholi