En Java, en utilisant l'instruction switch avec une plage de valeur dans chaque cas?


En Java est-il possible d'écrire une instruction switch où chaque cas contient plus d'une valeur? Par exemple (bien que clairement le code suivant ne fonctionnera pas):

switch (num) {
    case 1 .. 5:
        System.out.println("testing case 1 to 5");
        break;
    case 6 .. 10:
        System.out.println("testing case 6 to 10");
        break;
}

Je pense que cela peut être fait en Objective C, y a-t-il une chose similaire en Java? Ou devrais-je simplement utiliser if, else if déclarations à la place?

Author: Synia, 2012-06-04

14 answers

Java n'a rien de ce genre. Pourquoi ne pas simplement faire ce qui suit?

public static boolean isBetween(int x, int lower, int upper) {
  return lower <= x && x <= upper;
}

if (isBetween(num, 1, 5)) {
  System.out.println("testing case 1 to 5");
} else if (isBetween(num, 6, 10)) {
  System.out.println("testing case 6 to 10");
}
 84
Author: missingfaktor, 2017-08-23 14:18:47

Le plus proche que vous pouvez obtenir ce genre de comportement avec switch déclarations est

switch (num) {
case 1:
case 2:
case 3:
case 4:
case 5:
     System.out.println("1 through 5");
     break;
case 6:
case 7:
case 8:
case 9:
case 10:
     System.out.println("6 through 10");
     break;
}

Utilisez les instructions if.

 67
Author: Jeffrey, 2012-06-03 20:12:51

Une autre alternative consiste à utiliser une opération mathématique en la divisant, par exemple:

switch ((int) num/10) {
    case 1:
        System.out.println("10-19");
        break;
    case 2:
        System.out.println("20-29");
        break;
    case 3:
        System.out.println("30-39");
        break;
    case 4:
        System.out.println("40-49");
        break;
    default:
        break;
}

Mais, comme vous pouvez le voir, cela ne peut être utilisé que lorsque la plage est fixée dans chaque cas.

 23
Author: hayi, 2013-09-28 01:00:29

Je ne pense pas que vous puissiez le faire en Java. Le mieux est de simplement mettre le code dans le dernier cas de la gamme.

switch (num) {
  case 1: case 2: case 3: case 4: case 5: 
     System.Out.Println("testing case 1 to 5");
     break;
  case 6: case 7: case 8: case 9: case 10:
     System.Out.Println("testing case 6 to 10");
     break;
  default:
     //
}
 11
Author: blitzen, 2012-06-03 20:14:44
  case 1: case 2: case 3: case 4: case 5: 
         System.out.println("testing case 1 to 5");
         break;
  case 6: case 7: case 8: case 9: case 10:
         System.out.println("testing case 6 to 10");
         break;
  default:
         System.out.println("default"); 
 8
Author: Jitendra, 2018-07-06 00:56:13

Non, vous ne pouvez pas faire ça. Le mieux que vous pouvez faire est que

case 1:
case 2:
case 3:
case 4:
case 5: 
  System.Out.Println("testing case 1 to 5");
break;
 4
Author: FSP, 2012-06-03 22:00:11

Il est possible de regrouper plusieurs conditions dans la même instruction caseen utilisant le mécanisme de fall throughautorisé par les instructions switch, il est mentionné dans le Java tutorial et entièrement spécifié dans la section §14.11. L'instruction switch de la spécification de langage Java .

L'extrait de code suivant a été tiré d'un exemple dans le tutoriel, il calcule le nombre de jours dans chaque mois (numérotés du mois 1 au mois 12):

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

Comme vous pouvez le voir, pour couvrir une plage de valeurs dans une seule instruction case, la seule alternative est de lister chacune des valeurs possibles individuellement, l'une après l'autre. À titre d'exemple supplémentaire, voici comment implémenter le pseudocode dans la question:

switch(num) {
    case 1: case 2: case 3: case 4: case 5:
        System.out.println("testing case 1 to 5");
        break;
    case 6: case 7: case 8: case 9: case 10:
        System.out.println("testing case 6 to 10");
        break;
}
 3
Author: Óscar López, 2012-06-03 20:33:11

Essayez ceci si vous devez utiliser switch.

public static int range(int num){ 
    if ( 10 < num && num < 20)
        return 1;
    if ( 20 <= num && num < 30)
        return 2;
    return 3;
}

public static final int TEN_TWENTY = 1;
public static final int TWENTY_THIRTY = 2;

public static void main(String[]args){
    int a = 110;
    switch (range(a)){
        case TEN_TWENTY: 
            System.out.println("10-20"); 
            break;
        case TWENTY_THIRTY: 
            System.out.println("20-30"); 
            break;
        default: break;
    }
}
 3
Author: zl9394, 2016-01-08 05:27:48

Je sais que ce post est ancien mais je crois que cette réponse mérite une certaine reconnaissance. Il n'est pas nécessaire d'éviter l'instruction switch. Cela peut être fait en java mais via l'instruction switch, pas les cas. Elle implique l'utilisation d'opérateurs ternaires.

public class Solution {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int num = Integer.parseInt(sc.nextLine());

        switch ((1 <= num && num <= 5 ) ? 0 :
                (6 <= num && num <= 10) ? 1 : 2) {

            case 0:
                System.out.println("I'm between one and five inclusive.");
                break;
            case 1:
                System.out.println("I'm between 6 and 10 inclusive.");
                break;
            case 2:
                System.out.println("I'm not between one and five or 6 and 10 inclusive.");
                break;
        }
    }
}
 3
Author: DarkHark, 2018-03-04 16:00:45

Vous pouvez utiliser un enum pour représenter vos gammes,

public static enum IntRange {
  ONE_TO_FIVE, SIX_TO_TEN;
  public boolean isInRange(int v) {
    switch (this) {
    case ONE_TO_FIVE:
      return (v >= 1 && v <= 5);
    case SIX_TO_TEN:
      return (v >= 6 && v <= 10);
    }
    return false;
  }

  public static IntRange getValue(int v) {
    if (v >= 1 && v <= 5) {
      return ONE_TO_FIVE;
    } else if (v >= 6 && v <= 10) {
      return SIX_TO_TEN;
    }
    return null;
  }
}
 2
Author: Elliott Frisch, 2013-12-22 03:24:53

Ou vous pouvez utiliser vos cas solo comme prévu et utiliser votre cas par défaut pour spécifier les instructions de plage comme:

switch(n) {
    case 1 : System.out.println("case 1"); break;
    case 4 : System.out.println("case 4"); break;
    case 99 : System.out.println("case 99"); break;
    default :
        if (n >= 10 && n <= 15)
            System.out.println("10-15 range"); 
        else if (n >= 100 && n <= 200)
            System.out.println("100-200 range");
        else
            System.out.println("Your default case");
        break;   
}
 2
Author: Xalamadrax, 2016-04-24 08:48:50

Utilisez une implémentation NavigableMap, comme TreeMap.

/* Setup */
NavigableMap<Integer, Optional<String>> messages = new TreeMap<>();
messages.put(Integer.MIN_VALUE, Optional.empty());
messages.put(1, Optional.of("testing case 1 to 5"));
messages.put(6, Optional.of("testing case 6 to 10"));
messages.put(11, Optional.empty());

/* Use */
messages.floorEntry(3).getValue().ifPresent(System.out::println);
 2
Author: erickson, 2016-05-26 19:37:30

La réponse de@missingfaktor est en effet correcte mais un peu trop compliquée. Le code est plus verbeux (au moins pour les intervalles continus) qu'il pourrait l'être, et nécessite des surcharges/moulages et/ou un paramétrage pour long, float, Integer etc

if (num < 1)
    System.Out.Println("invalid case: " + num); // you should verify that anyway
else if (num <= 5)
    System.Out.Println("1 to 5");
else if (num <= 10)
    System.Out.Println("6 to 10");
else if (num <= 42)
    System.Out.Println("11 to 42");
else    
    System.Out.Println("43 to +infinity");
 1
Author: Alexander Malakhov, 2014-06-23 09:51:58

Voici une belle et minimaliste pour aller

(num > 1 && num < 5) ? first_case_method() 
                     : System.out.println("testing case 1 to 5")
                     : (num > 5 && num < 7)  ? System.out.println("testing case 1 to 5") 
                     : (num > 7 && num < 8)  ? System.out.println("testing case 1 to 5") 
                     : (num > 8 && num < 9)  ? System.out.println("testing case 1 to 5") 
                     : ... 
                     : System.out.println("default");
 1
Author: Williem, 2016-01-17 18:59:14