在Java中,在每种情况下使用带有一系列值的switch语句?

时间:2012-06-03 20:11:15

标签: java if-statement switch-statement

在Java中是否可以编写一个switch语句,其中每个case都包含多个值?例如(虽然以下代码显然不起作用):

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语句?

19 个答案:

答案 0 :(得分:92)

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

答案 1 :(得分:73)

使用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语句。

答案 2 :(得分:27)

其他替代方案是通过除以它来使用数学运算,例如:

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

但是,正如您所看到的,这只能在每种情况下固定范围时使用。

答案 3 :(得分:11)

我认为你不能用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:
     //
}

答案 4 :(得分:9)

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

答案 5 :(得分:4)

不,你不能那样做。你能做的最好的就是那个

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

答案 6 :(得分:4)

我知道这篇文章很老但我相信这个答案值得一些认可。没有必要避免switch语句。这可以在java中完成,但是通过switch语句,而不是案例。它涉及使用三元运算符。

var col = new DataServiceCollection<User>(_container.UserSystem.Where(x => x.id == entity.Id));
col[0].Name = "test"; //Update Property
_container.SaveChanges();

答案 7 :(得分:4)

如果必须使用开关,请尝试此操作。

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

答案 8 :(得分:3)

或者您可以按预期使用您的独奏案例,并使用您的默认案例将范围说明指定为:

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

答案 9 :(得分:3)

可以使用switch语句允许的 fall through 机制在同一case语句中对几个条件进行分组,它在{{{ 3}}并在Java tutorial的<{3}}部分中详细说明。

以下代码片段来自本教程中的示例,它计算每个月的天数(从第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;
}

答案 10 :(得分:2)

您可以使用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;
  }
}

答案 11 :(得分:2)

使用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);

答案 12 :(得分:1)

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

答案 13 :(得分:1)

这是一种美丽而简约的方式

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

答案 14 :(得分:0)

对于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);

答案 15 :(得分:0)

Java不支持这种类型的行为。但是,如果您有一个需要此项目的大型项目,请考虑在项目中混入Groovy代码。 Groovy代码被编译为字节代码,并且可以与JVM一起运行。我工作的公司使用Groovy编写服务类,使用Java编写其他所有东西。

答案 16 :(得分:0)

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

您也应该能够在ints上实现它。

答案 17 :(得分:0)

在阅读所有评论后,我没有看到有人提到 enhanced switch 在这样的情况下,您可以有多个值->

Rscript --vanilla add_fun.R  6 7

这是 Java 中增强开关的众多附加好处之一。

答案 18 :(得分:0)

优秀的贡献。如果它仍然有用,我找到了一个选项来分析字符串中是否有不同于字母和空格的字符:

string name = scEntry.nextLine();
int len = name.length(); 
int s = 0;
do { 
     int asc = name.codePointAt(s);
     switch ((asc == 32) ? 0 : (64 < asc && asc < 91) ? 1 : 
             (96 < asc && asc < 123) ? 2 : 99) {
         case 0, 1, 2 -> {
                  s++; 
                  break;
         }
         case 99 -> {
           s = 0;
           System.out.println("Type in only letters [A-Za-z]
                             or spaces");
           System.out.print("Type the user name again: ");
           name = scEntry.nextLine();
           len = name.length();
           break;
         }
} while (s < len);
s = 0;

在这个例子中,字母的 ASCII 码和“空格”的 ASCII 码被分组并用数字 0、1 或 2 表示。 与上述不同的 ASCII 代码被分组在值“99”中,因此我可以将有关它们的任何信息通知用户。