102

Java では、各ケースに複数の値が含まれる switch ステートメントを記述できますか? たとえば、(明らかに次のコードは機能しませんが):

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

これはObjective Cでできると思いますが、Javaにも同様のものはありますか? または、代わりにif,else ifステートメントを使用する必要がありますか?

4

19 に答える 19

111

Javaにはそのようなものはありません。なぜ次のことをしないのですか?

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");
}
于 2012-06-03T20:49:46.767 に答える
79

switchステートメントでそのような動作に最も近いのは

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

ifステートメントを使用します。

于 2012-06-03T20:12:51.280 に答える
15

Javaでそれを行うことはできないと思います。最善の策は、コードを範囲の最後のケースに入れることです。

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:
     //
}
于 2012-06-03T20:14:44.370 に答える
6

スイッチを使用する必要がある場合は、これを試してください。

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;
    }
}
于 2016-01-08T05:27:48.163 に答える
4

switch ステートメントで許可されているフォールスルーcaseのメカニズムを使用して、同じステートメントで複数の条件をグループ化することができます。これはJava チュートリアルで言及され、セクション§14.11 で完全に指定されています。Java 言語仕様switch ステートメント

次のコード スニペットはチュートリアルの例から抜粋したもので、各月の日数を計算します (月 1 から月 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;
}

ご覧のとおり、1 つのcaseステートメントで値の範囲をカバーする唯一の代替手段は、可能な値をそれぞれ個別にリストすることです。追加の例として、質問の疑似コードを実装する方法は次のとおりです。

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;
}
于 2012-06-03T20:15:56.897 に答える
4

いいえ、それはできません。あなたができる最善のことは、

case 1:
case 2:
case 3:
case 4:
case 5: 
  System.Out.Println("testing case 1 to 5");
break;
于 2012-06-03T20:14:32.970 に答える
3

を使用しenumて範囲を表すことができます。

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;
  }
}
于 2013-12-22T03:24:53.773 に答える
2

@missingfaktor の答えは確かに正しいですが、少し複雑です。コードは(少なくとも連続間隔の場合)より冗長であり、オーバーロード/キャストおよび/または long、float、Integer などのパラメータ化が必要です。

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");
于 2014-05-18T09:20:31.397 に答える