Switchステートメントを使用して数値の範囲を確認したいのですが、_case 1...5
_やcase (score >= 120) && (score <=125)
のようなものが機能すると言っている場所がいくつか見つかりましたが、どういうわけかエラーが発生し続けます。
私が欲しいのは、番号が1600〜1699の間にある場合、何かをすることです。
Ifステートメントは実行できますが、可能であればswitchの使用を開始する時期だと考えました。
JVMレベルでは、switch
ステートメントはifステートメントとは根本的に異なります。
Switchは、javacコンパイラが効率的なバイトコードを生成するように、コンパイル時にすべて指定する必要があるコンパイル時定数に関するものです。
In Java switch
ステートメントは範囲をサポートしていません。すべての値(大文字と小文字を区別することを利用できます)とdefault
caseを指定する必要があります。 if
ステートメントによって処理されます。
私の知る限り、Javaのスイッチケースでは範囲を指定できません。あなたは次のようなことをすることができます
switch (num) {
case 1: case 2: case 3:
//stuff
break;
case 4: case 5: case 6:
//more stuff
break;
default:
}
ただし、その時点では、ifステートメントを使用することをお勧めします。
三項演算子? :
を使用できます
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
}
本当に switchステートメントを使用したい場合—これはenum
sで疑似範囲を作成する方法であり、列挙型を切り替えることができます。
まず、範囲を作成する必要があります。
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;
}