web-dev-qa-db-ja.com

java-範囲がintのswitchステートメント

Switchステートメントを使用して数値の範囲を確認したいのですが、_case 1...5_やcase (score >= 120) && (score <=125)のようなものが機能すると言っている場所がいくつか見つかりましたが、どういうわけかエラーが発生し続けます。

私が欲しいのは、番号が1600〜1699の間にある場合、何かをすることです。

Ifステートメントは実行できますが、可能であればswitchの使用を開始する時期だと考えました。

7
WXR

JVMレベルでは、switchステートメントはifステートメントとは根本的に異なります。

Switchは、javacコンパイラが効率的なバイトコードを生成するように、コンパイル時にすべて指定する必要があるコンパイル時定数に関するものです。

In Java switchステートメントは範囲をサポートしていません。すべての値(大文字と小文字を区別することを利用できます)とdefaultcaseを指定する必要があります。 ifステートメントによって処理されます。

10

私の知る限り、Javaのスイッチケースでは範囲を指定できません。あなたは次のようなことをすることができます

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

ただし、その時点では、ifステートメントを使用することをお勧めします。

5
Matter Cat

三項演算子? :を使用できます

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
}
3
CoderCroc

本当に switchステートメントを使用したい場合—これはenumsで疑似範囲を作成する方法であり、列挙型を切り替えることができます。

まず、範囲を作成する必要があります。

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

そしてあなたのスイッチ:

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
MC Emperor