我正在尝试在我的评分系统中使用switch语句,但我没有找到在switch case部分中包含一系列值的正确方法。然而,我在这里研究并发现使用isBetween:
public static isBetween(int x, int lower, int upper)
{
return lower <=x && x<=upper;
}
我试图以这种方式使用它来检查提交的标记是否介于1-20的范围内:
switch (mark) {
case isBetween(0, 20):
System.out.println("Grade is E");
break;
case isBetween(21, 29):
System.out.println("Grade is D");
break;
}
我知道这是错误的,因为它不起作用。有人会帮我纠正我的代码吗?在这种情况下,我必须使用switch语句。
答案 0 :(得分:3)
在switch语句中,每个case
都会评估switch(param)
中的输入参数是否与该情况相同。例如,如果我要写switch(3)
,则只会执行case 3:
。
这里有几个问题。首先,case
中的方法返回boolean
,但您正在切换int
。因此,当代码检查输入参数mark
是否等于isBetween(0,20)
时,它会尝试比较int
和boolean
。你实际上并不想这样做。您想要查看mark
是否为值0,1,2,3,4,5之一.20。如果您在此处使用案例陈述,则需要比较mark
每个值的case
。
其次,正如Eric所述,您需要在case
语句中使用静态值。这意味着你不能让函数返回String
,因为它可能会根据函数的内部结构而改变。
此外,isBetween()
要求您输入要确定的数字介于两个其他人之间。现在你的代码没有正确的输入数量。正如Tiny指出的那样,该方法还应该声明它返回boolean
。定义方法时总是需要返回类型。
执行此操作的最佳方法可能不使用switch-case,看起来像这样:
public static boolean isBetween(int x, int lower, int upper)
{
return lower <=x && x<=upper;
}
public void printMark(int mark){
if(isBetween(mark, 0, 20))
System.out.println("Grade is E");
else if(isBetween(mark, 21, 29))
System.out.println("Grade is D");
}
由于你必须使用switch-case,我会调整它,就像这样:
private static final int GRADE_E = 0;
private static final int GRADE_D = 1;
public static boolean isBetween(int x, int lower, int upper)
{
return lower <=x && x<=upper;
}
private int getMarkCode(int markParam){
if(isBetween(markParam, 0, 20))
return GRADE_E;
else if(isBetween(markParam, 21, 29))
return GRADE_D;
}
public void printMark(int mark){
switch(getMarkCode(mark)){
case GRADE_E:
System.out.println("Grade is E");
break;
case GRADE_D:
System.out.println("Grade is D");
break;
}
}
注意这比第一种情况更长,并且相当多余。还要注意我如何命名我在case语句中使用的代码。您看到很多写得很好的案例陈述都不会使用数字,而是使用描述性名称。特别是当你使用没有任何固有含义的代码时,就像我在这里用0代表E等级和1代表D等级,你想要一个描述性的名字。但是,通常,您应该避免使用代码,而是使用代码尝试表示的值,无论该值是字符串,int还是某种类型的对象。
答案 1 :(得分:1)
如果您“必须”使用开关/案例陈述,请尝试:
char grade='?';
switch (mark) {
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
case 10:
case 11:
case 12:
case 13:
case 14:
case 15:
case 16:
case 17:
case 18:
case 19:
case 20:
grade='F'; // I've never seen anyone given a grade of 'E'...
break;
case 21:
case 22:
case 23:
case 24:
case 25:
case 26:
case 27:
case 28:
case 29:
grade='D';
break;
}
System.out.println("Grade is "+grade);
除非可以在编译时完全解析,否则不能将表达式用作案例值。原因与如何编译switch / case有关,就是将其转换为一个跳转表,其值被打开,用于索引到该表中。
答案 2 :(得分:1)
如果
public static void main(String[] args) {
Grade g = Grade.gradeValueOf(20);
switch(g){
case D:
//do something for D
break;
case E:
//do something for E
break;
}
}
和
public enum Grade {
E(0,20),D(21,29);
private int min,max;
private Grade(int min, int max) {
this.min = min;
this.max = max;
}
public static Grade gradeValueOf(int val){
for(Grade g:Grade.values()){
if (g.min <= val && val <= g.max){
return g;
}
}
return null;
}
}
你还在使用开关: - )