充分利用 switch 语句

Fully utilizing a switch statement

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

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

我已经知道哪里出错了:

但这让我想知道:如何 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 语句表达吗?

简短的回答:不能。 长答案: switch 语句不能接受这样的表达式,因为 switch 语句对变量的单个值进行操作,而不是像您所显示的那样对变量范围进行操作。

对于您的情况,if 语句更易读。 switch 语句适用于较小的 intenum 值集。

在Java中,一个switch语句只能测试int值(自Java 1.0),枚举值(自Java 5.0),和 String 值(自 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: (...)
}

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

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

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

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

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

我刚刚做的这个版本可以说更优雅了:

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

在一些编程语言中是这样的

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 */}