wake-up-neo.com

Verwenden Sie jeweils eine switch-Anweisung mit einem Wertebereich?

Ist es in Java möglich, eine switch-Anweisung zu schreiben, bei der jeder Fall mehr als einen Wert enthält? Zum Beispiel (obwohl klar ist, dass der folgende Code nicht funktioniert):

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

Ich denke, dass dies in Objective C möglich ist. Gibt es in Java etwas Ähnliches? Oder sollte ich einfach if, else if stattdessen Aussagen?

88
Synia

Java hat nichts dergleichen. Warum nicht einfach Folgendes tun?

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

Das, was Sie mit switch -Anweisungen an ein solches Verhalten heranführen können, ist

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

Verwenden Sie if Anweisungen.

74
Jeffrey

eine andere Alternative ist die Verwendung einer mathematischen Operation durch Teilen, zum Beispiel:

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

Wie Sie sehen, kann dies jedoch nur verwendet werden, wenn der Bereich jeweils festgelegt ist.

28
Hayi Nukman

Ich denke nicht, dass Sie das in Java tun können. Am besten geben Sie den Code einfach in den letzten Fall des Bereichs ein.

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

Nein, das kannst du nicht. Das Beste, was Sie tun können, ist das

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

Versuchen Sie dies, wenn Sie den Schalter verwenden müssen.

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

Ich weiß, dass dieser Beitrag alt ist, aber ich glaube, dass diese Antwort eine gewisse Anerkennung verdient. Die switch-Anweisung muss nicht umgangen werden. Dies kann in Java, aber nicht in den Fällen durch die switch-Anweisung geschehen. Dabei werden ternäre Operatoren verwendet.

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

Es ist möglich, mehrere Bedingungen in derselben case -Anweisung zu gruppieren, indem der Mechanismus von fall through verwendet wird. Dies wird im Java-Tutorial und erwähnt vollständig spezifiziert in Abschnitt §14.11. Die switch-Anweisung der Java Language Specification .

Der folgende Codeausschnitt wurde aus einem Beispiel im Lernprogramm entnommen und berechnet die Anzahl der Tage in jedem Monat (nummeriert von Monat 1 bis Monat 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;
}

Wie Sie sehen, besteht die einzige Alternative, um einen Wertebereich in einer einzelnen case -Anweisung abzudecken, darin, jeden der möglichen Werte einzeln nacheinander aufzulisten. Als zusätzliches Beispiel sehen Sie hier, wie Sie den Pseudocode in der Frage implementieren:

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

Oder Sie können Ihre Solo-Cases wie vorgesehen verwenden und Ihre Standard-Cases verwenden, um die Range-Anweisungen wie folgt anzugeben:

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

Verwenden Sie eine NavigableMap -Implementierung wie 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

Sie könnten ein enum verwenden, um Ihre Bereiche darzustellen,

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

Hier ist ein schöner und minimalistischer Weg

(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

Ab Java 12 Ich glaube, es wird unterstützt. Check out JEP 354 . Ich habe die Syntax nie verwendet, aber ich denke, es würde für Ihren Fall so laufen.

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

Sie sollten das auch auf ints implementieren können.

1
A_Arnold

Die Antwort von @missingfaktor ist zwar richtig, aber etwas zu kompliziert. Code ist ausführlicher (zumindest für kontinuierliche Intervalle) als es sein könnte und erfordert Überladungen/Umwandlungen und/oder Parametrisierung für long, float, Integer usw

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

Diese Art von Verhalten wird in Java nicht unterstützt. Wenn Sie jedoch ein großes Projekt haben, das dies benötigt, sollten Sie Groovy-Code in Ihrem Projekt einblenden. Groovy-Code wird in Byte-Code kompiliert und kann mit JVM ausgeführt werden. Die Firma, für die ich arbeite, verwendet Groovy, um Serviceklassen zu schreiben und Java um alles andere zu schreiben.

0
isoplayer

Für Eingangsnummer im Bereich 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