384 votes

Utilisation de deux valeurs pour une instruction de type switch case

Dans mon code, le programme fait quelque chose en fonction du texte saisi par l'utilisateur. Mon code ressemble à ceci :

switch (name) {
        case text1: {
            //blah
            break;
        }
        case text2: {
            //blah
            break;
        }
        case text3: {
            //blah
            break;
        }
        case text4: {
            //blah
            break;
        }

Cependant, le code à l'intérieur des cas text1 y text4 est le même. Je me demandais donc s'il me serait possible d'implémenter quelque chose comme

case text1||text4: {
            //blah
            break;
        }

Je sais que le || ne fonctionnera pas dans la déclaration de cas, mais y a-t-il quelque chose de similaire que je puisse utiliser ?

45 votes

Le fait d'être une question de base la rend plus éligible aux votes positifs si elle n'est pas dupliquée car elle est largement utile. Et c'est quelque chose qui ne m'était pas apparu comme possible mais maintenant que je le réalise, c'est d'une évidence aveuglante. Donc, dans l'ensemble, un Q&A assez impressionnant.

1 votes

@RichardTingle - connaissez-vous le dispositif de Duff - fr.wikipedia.org/wiki/Duff%27s_device

0 votes

@SrujanKumarGulla Vous n'êtes pas seul, il y a au moins 85 autres jaloux ;)

718voto

PSR Points 14768

Vous pouvez utiliser les deux CASE comme suit.

  case text1: 
  case text4:{
            //blah
            break;
        }

VOIR CET EXEMPLE : Cet exemple de code calcule le nombre de jours d'un mois donné :

class SwitchDemo {
    public static void main(String[] args) {

        int month = 2;
        int year = 2000;
        int numDays = 0;

        switch (month) {
            case 1:
            case 3:
            case 5:
            case 7:
            case 8:
            case 10:
            case 12:
                numDays = 31;
                break;
            case 4:
            case 6:
            case 9:
            case 11:
                numDays = 30;
                break;
            case 2:
                if (((year % 4 == 0) && 
                     !(year % 100 == 0))
                     || (year % 400 == 0))
                    numDays = 29;
                else
                    numDays = 28;
                break;
            default:
                System.out.println("Invalid month.");
                break;
        }
        System.out.println("Number of Days = "
                           + numDays);
    }
}

Voici le résultat de ce code :

Number of Days = 29

FALLTHROUGH :

Un autre point intéressant est la déclaration de rupture. Chaque instruction break met fin à l'instruction switch qui l'entoure. Le flux de contrôle continue avec la première instruction suivant le bloc switch. Les instructions break sont nécessaires car, sans elles, les instructions dans les blocs switch fall through : Toutes les instructions après l'étiquette de cas correspondante sont exécutées en séquence, indépendamment de l'expression des étiquettes de cas suivantes, jusqu'à ce qu'une instruction break soit rencontrée.

EXEMPLE DE CODE :

public class SwitchFallThrough {

    public static void main(String[] args) {
        java.util.ArrayList<String> futureMonths =
            new java.util.ArrayList<String>();

        int month = 8;

        switch (month) {
            case 1:  futureMonths.add("January");
            case 2:  futureMonths.add("February");
            case 3:  futureMonths.add("March");
            case 4:  futureMonths.add("April");
            case 5:  futureMonths.add("May");
            case 6:  futureMonths.add("June");
            case 7:  futureMonths.add("July");
            case 8:  futureMonths.add("August");
            case 9:  futureMonths.add("September");
            case 10: futureMonths.add("October");
            case 11: futureMonths.add("November");
            case 12: futureMonths.add("December");
            default: break;
        }

        if (futureMonths.isEmpty()) {
            System.out.println("Invalid month number");
        } else {
            for (String monthName : futureMonths) {
               System.out.println(monthName);
            }
        }
    }
}

Voici le résultat de ce code :

August
September
October
November
December

Utilisation de chaînes de caractères dans les instructions de commutation

En Java SE 7 et plus, vous pouvez utiliser un objet String dans le commutateur dans l'expression de l'instruction switch. L'exemple de code suivant, , affiche le numéro du mois en fonction de la valeur de l'objet String nommée mois :

public class StringSwitchDemo {

    public static int getMonthNumber(String month) {

        int monthNumber = 0;

        if (month == null) {
            return monthNumber;
        }

        switch (month.toLowerCase()) {
            case "january":
                monthNumber = 1;
                break;
            case "february":
                monthNumber = 2;
                break;
            case "march":
                monthNumber = 3;
                break;
            case "april":
                monthNumber = 4;
                break;
            case "may":
                monthNumber = 5;
                break;
            case "june":
                monthNumber = 6;
                break;
            case "july":
                monthNumber = 7;
                break;
            case "august":
                monthNumber = 8;
                break;
            case "september":
                monthNumber = 9;
                break;
            case "october":
                monthNumber = 10;
                break;
            case "november":
                monthNumber = 11;
                break;
            case "december":
                monthNumber = 12;
                break;
            default: 
                monthNumber = 0;
                break;
        }

        return monthNumber;
    }

    public static void main(String[] args) {

        String month = "August";

        int returnedMonthNumber =
            StringSwitchDemo.getMonthNumber(month);

        if (returnedMonthNumber == 0) {
            System.out.println("Invalid month");
        } else {
            System.out.println(returnedMonthNumber);
        }
    }
}

La sortie de ce code est 8.

FROM Java Docs

0 votes

Oh ok. C'était facile. Je ne savais pas que je pouvais faire ça.

21 votes

Il convient de mentionner que cette caractéristique linguistique est appelée "fallthrough". Les cas sans break sont en fait annexés au bloc de cas suivant qui est visuellement en dessous, donc automne à travers.

0 votes

@EmperorOrionii j'ai mis à jour ma réponse comme vous le suggérez. Merci.

52voto

Grijesh Chauhan Points 28442

Vous pouvez procéder comme suit pour utiliser plusieurs cas pour une seule instruction de commutation :

case "firstCase":
case "secondCase": {
    // Run code here for both cases
}

1 votes

2 votes

@Xiddoc Pour répondre à l'OP, j'ai utilisé text1 comme "firstCase" y text4 comme "secondCase" , lisez la question case text1||text4: { //blah break; } votre édition est passée, mais la réponse originale était simple pour le PO.

0 votes

C'est ma faute, j'ai fait une autre modification pour annuler le changement de nom de l'affaire.

29voto

Bohemian Points 134107

Le site case sont simplement des points d'accès sans code qui peuvent partager le même point d'entrée :

case text1:
case text4: 
    //blah
    break;

Notez que les accolades sont redondantes.

0 votes

@trig lol. Je fais souvent ce genre de choses ces derniers temps - c'est la faute de l'iPhone qui tape avec le pouce. Au revoir

22voto

kaljak Points 400

Fais-le.

case text1: case text4: 
     do stuff;
     break;

5voto

Colin D Points 4229

Le site fallthrough Les réponses des autres sont bonnes.

Cependant, une autre approche consisterait à extraire des méthodes du contenu de vos déclarations de cas, puis à appeler la méthode appropriée dans chaque cas.

Dans l'exemple ci-dessous, les cas "text1" et "text4" se comportent de la même manière :

switch (name) {
        case text1: {
            method1();
            break;
        }
        case text2: {
            method2();
            break;
        }
        case text3: {
            method3();
            break;
        }
        case text4: {
            method1();
            break;
        }

Personnellement, je trouve ce style d'écriture des déclarations de cas plus facile à maintenir et légèrement plus lisible, surtout lorsque les méthodes que vous appelez ont des noms bien descriptifs.

1 votes

Il n'est pas plus facile à maintenir si text1 y text4 fera TOUJOURS la même chose, indépendamment d'un changement futur. S'ils doivent toujours être liés, un changement dans le cas de text1 (c'est-à-dire changer la méthode qu'elle appelle) nécessiterait une modification de l'application text4 . Dans ce cas, il n'est évidemment pas plus facile à maintenir. Cela dépend de la situation.

1 votes

Je dirai que cette méthode devrait probablement être combinée avec l'autre méthode de toute façon, puisque les instructions de commutation ne sont pas (IMHO) la plus jolie structure de programmation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X