充分利用 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 语句不是为像
(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 语句表达吗?
简短的回答:不能。
长答案: switch 语句不能接受这样的表达式,因为 switch 语句对变量的单个值进行操作,而不是像您所显示的那样对变量范围进行操作。
对于您的情况,if
语句更易读。 switch
语句适用于较小的 int
或 enum
值集。
在Java中,一个switch
语句只能测试int
值(自Java 1.0),枚举值(自Java 5.0),和 String 值(自 Java 7.0 起),并且只能测试相等性。请注意,byte
、short
和 char
可以向上转换为 int
。但是无法测试 long
、float
和 double
值。
法律示例:
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 */}
我的 Java 教科书问我以下错误:
switch (score)
{
case (score > 90):
grade = 'A';
break;
case (score > 80):
grade = 'B';
break;
default:
grade = 'C';
}
我已经知道哪里出错了:
- Switch 语句不是为像
(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 语句表达吗?
简短的回答:不能。 长答案: switch 语句不能接受这样的表达式,因为 switch 语句对变量的单个值进行操作,而不是像您所显示的那样对变量范围进行操作。
对于您的情况,if
语句更易读。 switch
语句适用于较小的 int
或 enum
值集。
在Java中,一个switch
语句只能测试int
值(自Java 1.0),枚举值(自Java 5.0),和 String 值(自 Java 7.0 起),并且只能测试相等性。请注意,byte
、short
和 char
可以向上转换为 int
。但是无法测试 long
、float
和 double
值。
法律示例:
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 */}