充分利用switch语句

时间:2015-07-07 17:02:55

标签: java switch-statement

我的Java教科书问我以下错误:

switch (score)
        {
            case (score > 90):
                grade = 'A';
                break;
            case (score > 80):
                grade = 'B';
                break;
            default:
                grade = 'C';
        }

我已经知道错误的位置:

  • 不为(score > 90)等比较构建切换语句;那是if / else语句。

但是这让我想知道:如何一个switch语句有效地解释了整数范围?

我能想到的最明显的例子如下,但我发现它相当暴力:

switch (score)
    {
        case 90: case 91: case 92: case 94: case 95:
        case 96: case 97: case 98: case 99: case 100:
            grade = 'A';
            break;
        case 80: case 81: case 82: case 84: case 85:
        case 86: case 87: case 88: case 89:
            grade = 'B';
            break;
        default:
            grade = 'C';
    }

如何在switch语句中表达这样的概念?

7 个答案:

答案 0 :(得分:8)

如果您利用分数随着10的每次更改而变化的事实,并假设score是整数数据类型,那么您可以除以10消除大多数情况:

switch (score / 10)
{
    case 9:
    case 10:
        grade = 'A';
        break;
    case 8:
        grade = 'B';
        break;
    default:
        grade = 'C';
}

如果没有这样的规则(如果"等级"桶大小不同且任意),那么你能做的最好的是if / else-if / else语句。

答案 1 :(得分:1)

简短的回答:它不能。 答案很长:switch语句不能接受这样的表达式,因为switch语句对变量的单个值进行操作,而不是像你所示的一系列变量。

答案 2 :(得分:1)

可能不是最佳答案,但可以采用非常简单的方法

int temp;

if(score > 90) 
 temp = 1;
else if(score > 80) 
 temp = 2;


switch (temp)
        {
            case (1):
                grade = 'A';
                break;
            case (2):
                grade = 'B';
                break;
            default:
                grade = 'C';
        }

答案 3 :(得分:1)

我刚刚制作的这个版本可以被认为更优雅:

 int score_new = score/10 

\\This gets you the first digit.. make sure score_new is int and not double

switch (score_new)

{
   case 10: case 9:
        grade = 'A';
        break;        
    case 8:
        grade = 'B';
        break;
    default:
        grade = 'C';
}

答案 4 :(得分:1)

在某些编程语言中有类似的东西

switch (true) {
  case (0 <= val &&  val < 1000): /* do something */ break;
  case (1000 <= val &&  val < 2000): /* do something */ break;
  ...
  case (29000 <= val &&  val < 30000): /* do something */ break;
}

是可能的,但首先它不是非常高效,第二个java不接受它。所以使用if-then-else:

 int val = 500;
 if (0 <= val &&  val < 1000){ System.out.println("Test");}
 else if (1000 <= val &&  val < 2000){ /* do something */}
 else if (29000 <= val &&  val < 30000){ /* do something */}

答案 5 :(得分:0)

对于您的情况,if语句更好,更易读。 switch语句适用于少量intenum值。

答案 6 :(得分:-1)

在Java中,switch语句只能测试int值(自Java 1.0起),枚举值(自Java 5.0起)和字符串值(自Java 7.0起),并且只能测试测试平等。请注意,byteshortchar可以上传到int。但无法测试longfloatdouble值。

法律例子:

int x = (...);
switch (x) {
    case 0: (...)
}

byte x = (...);
switch (x) {
    case 0: (...)
}

String x = (...);
switch (x) {
   case "a": (...)
}

非法的例子:

long x = (...);
switch (x) {
    case 0: (...)
}

double x = (...);
switch (x) {
    case 0.0: (...)
}