使用switch语句的case部分中的方法

时间:2014-01-27 03:27:44

标签: java switch-statement case

我正在尝试在我的评分系统中使用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语句。

3 个答案:

答案 0 :(得分:3)

在switch语句中,每个case都会评估switch(param)中的输入参数是否与该情况相同。例如,如果我要写switch(3),则只会执行case 3:

这里有几个问题。首先,case中的方法返回boolean,但您正在切换int。因此,当代码检查输入参数mark是否等于isBetween(0,20)时,它会尝试比较intboolean。你实际上并不想这样做。您想要查看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;
}
}

你还在使用开关: - )