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?
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");
}
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
.
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.
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:
//
}
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");
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;
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;
}
}
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;
}
}
}
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;
}
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;
}
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);
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;
}
}
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");
À 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.
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");
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.
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);