web-dev-qa-db-fra.com

Vous utilisez une instruction switch avec une plage de valeur dans chaque cas?

En Java, est-il possible d'écrire une instruction switch dans laquelle chaque cas contient plus d'une valeur? Par exemple (bien que le code suivant ne fonctionne clairement 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?

88
Synia

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");
}
94
missingfaktor

Le plus proche que vous pouvez obtenir à ce genre de comportement avec les instructions switch 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.

74
Jeffrey

l’autre alternative est d’utiliser l’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 constater, cela ne peut être utilisé que lorsque la plage est fixée dans chaque cas.

28
Hayi Nukman

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

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
blitzen
  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"); 
9
Jitendra

Non, tu ne peux pas faire ça. Le mieux que vous puissiez faire est que

case 1:
case 2:
case 3:
case 4:
case 5: 
  System.Out.Println("testing case 1 to 5");
break;
4
FSP

Essayez ceci si vous devez utiliser un commutateur.

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

Je sais que ce message est ancien, mais je pense que cette réponse mérite une reconnaissance. Il n'est pas nécessaire d'éviter l'instruction switch. Cela peut être fait dans Java mais via l'instruction switch, pas dans les cas. Cela 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;
        }
    }
}
4
DarkHark

Il est possible de regrouper plusieurs conditions dans la même instruction case à l'aide du mécanisme de échouant autorisé par les instructions switch, il est mentionné dans - didacticiel Java et spécifié dans la section §14.11. L'instruction switch de spécification de langage Java .

L'extrait de code suivant, tiré d'un exemple du didacticiel, calcule le nombre de jours de chaque mois (numéroté 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 constater, pour couvrir une plage de valeurs dans une seule instruction case, la seule alternative consiste à répertorier chacune des valeurs possibles, les unes après les autres. À 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
Óscar López

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

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

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
erickson

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

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
Elliott Frisch

Voici un chemin magnifique et minimaliste

(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
Williem

À partir de Java 12 Je crois que cela est pris en charge. Vérifiez JEP 354 . Je n’ai jamais utilisé la syntaxe, mais je pense que cela fonctionnerait ainsi pour votre cas.

switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);//number of letters
    case TUESDAY                -> System.out.println(7);
    case THURSDAY, SATURDAY     -> System.out.println(8);
    case WEDNESDAY              -> System.out.println(9);
}

Vous devriez pouvoir implémenter cela aussi sur les ints.

1
A_Arnold

La réponse de @missingfaktor est certes correcte mais un peu trop compliquée. Le code est plus bavard (au moins pour des intervalles continus) qu’il pourrait l’être, et nécessite des surcharges/des conversions 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

Ce type de comportement n'est pas pris en charge en Java. Toutefois, si vous avez un projet volumineux qui en a besoin, envisagez d'intégrer du code Groovy à votre projet. Le code Groovy est compilé en code octet et peut être exécuté avec JVM. La société pour laquelle je travaille utilise Groovy pour écrire des classes de service et Java pour écrire tout le reste.

0
isoplayer

Pour un nombre compris dans la plage 0..100

int n1 = 75; // input value
String res; int n=0; 
int[] a ={0,20,35,55,70,85,101};

for(; n1>=a[n]; n++);
switch(6-n+1) {
  case 1: res="A"; break;
  case 2: res="B"; break;
  case 3: res="C"; break;
  case 4: res="D"; break;
  case 5: res="E"; break;
  default:res="F";
}
System.out.println(res);
0
zemiak