web-dev-qa-db-ja.com

それぞれの場合に値の範囲でswitchステートメントを使用していますか?

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でも同様のことがありますか?または、代わりにifelse ifステートメントを使用する必要がありますか?

88
Synia

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");
}
94
missingfaktor

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ステートメントを使用します。

74
Jeffrey

他の代替方法は、算術演算を分割して使用することです。例:

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

しかし、ご覧のとおり、これはそれぞれの場合に範囲が固定されている場合にのみ使用できます。

28
Hayi Nukman

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:
     //
}
11
blitzen
  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"); 
9
Jitendra

いいえ、できません。できることは

case 1:
case 2:
case 3:
case 4:
case 5: 
  System.Out.Println("testing case 1 to 5");
break;
4
FSP

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

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

私はこの投稿が古いことを知っていますが、この答えは認識に値すると思います。 switchステートメントを回避する必要はありません。これはJavaで実行できますが、ケースではなくswitchステートメントを使用します。三項演算子を使用する必要があります。

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

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

次のコードスニペットは、チュートリアルの例から引用したもので、各月の日数(月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;
}

ご覧のとおり、単一の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;
}
3
Óscar López

または、ソロケースを意図したとおりに使用し、デフォルトのケースを使用して範囲指示を次のように指定できます。

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

NavigableMap のような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);
2
erickson

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;
  }
}
2
Elliott Frisch

美しくシンプルな方法を紹介します

(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");
1
Williem

Java 12現在、サポートされていると思います。 JEP 354 をご覧ください。構文を使用したことはありませんが、あなたの場合はこのように実行されると思います。

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

あなたもintにそれを実装できるはずです。

1
A_Arnold

@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");
1

このタイプの動作は、Javaではサポートされていません。ただし、これを必要とする大規模なプロジェクトがある場合は、プロジェクトにGroovyコードをブレンドすることを検討してください。 Groovyコードはバイトコードにコンパイルされ、JVMで実行できます。私が働いている会社では、Groovyを使用してサービスクラスを記述し、Javaを使用して他のすべてを記述しています。

0
isoplayer

範囲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);
0
zemiak