instruction java-switch avec plage de int


Je veux utiliser une instruction switch pour vérifier une plage de nombres J'ai trouvé quelques endroits disant quelque chose comme case 1...5 ou case (score >= 120) && (score <=125) fonctionnerait mais je continue à obtenir des erreurs.

Ce que je veux, c'est que si le nombre est compris entre 1600 et 1699, faites quelque chose.

Je peux faire des instructions if mais j'ai pensé qu'il était temps de commencer à utiliser switch si possible.

Author: WXR, 2015-03-06

4 answers

Au niveau de la JVM, l'instruction switch est fondamentalement différente des instructions if.

Switch concerne les constantes de compilation qui doivent toutes être spécifiées au moment de la compilation, de sorte que le compilateur javac produit un bytecode efficace.

En Java, l'instruction switch ne prend pas en charge les plages. Vous devez spécifier toutes les valeurs (vous pourriez profiter de tomber dans les cas) et default case. Tout le reste doit être géré par des instructions if.

 9
Author: Crazyjavahacking, 2015-03-06 10:34:27

Pour autant que je sache, les plages ne sont pas possibles pour les cas de commutation en Java. Vous pouvez faire quelque chose comme

switch (num) {
  case 1: case 2: case 3:
    //stuff
    break;
  case 4: case 5: case 6: 
    //more stuff
    break;
  default:
}

Mais à ce stade, vous pourriez aussi bien rester avec l'instruction if.

 5
Author: Matter Cat, 2015-03-06 05:45:40

Vous pouvez utiliser l'opérateur ternaire, ? :

int num = (score >= 120) && (score <=125) ? 1 : -1;
num = (score >= 1600) && (score <=1699 ) ? 2 : num;
switch (num) {
    case 1 :
       break;
    case 2 :
       break;
    default :
      //for -1
}
 2
Author: coder-croc, 2015-03-06 05:54:37

Si vous voulez vraimentutiliser des instructions switch-voici un moyen de créer des pseudo-plages avec enum s, de sorte que vous pouvez basculer sur les énumérations.

Tout d'abord, nous devrons créer les plages:

public enum Range {

    TWO_HUNDRED(200, 299),
    SIXTEEN_HUNDRED(1600, 1699),
    OTHER(0, -1); // This range can never exist, but it is necessary
                  // in order to prevent a NullPointerException from
                  // being thrown while we switch

    private final int minValue;
    private final int maxValue;

    private Range(int min, int max) {
        this.minValue = min;
        this.maxValue = max;
    }

    public static Range getFrom(int score) {
        return Arrays.asList(Range.values()).stream()
            .filter(t -> (score >= t.minValue && score <= t.maxValue))
            .findAny()
            .orElse(OTHER);
    }
}

Puis votre commutateur:

int num = 1630;
switch (Range.getFrom(num)) {

    case TWO_HUNDRED:
        // Do something
        break;

    case SIXTEEN_HUNDRED:
        // Do another thing
        break;

    case OTHER:
    default:
        // Do a whole different thing
        break;
}
 1
Author: MC Emperor, 2017-12-20 11:16:01