在Java中使用switch case作为条件语句

3

我正在尝试使用switch case根据变量选择条件,但是我遇到了错误。正确的处理过程是什么?是否可以使用switch case,还是应该使用嵌套的iffs?

public class Grader {
   // no attributes required
    public Grader() {
// no code required
}


public String grade(int mark) {
    String grade = null;
// code to determine grade goes here
    switch (mark){
        //For marks 85-100, Grade is HD
        case ((100>=mark>=85)):
            grade="HD";
            break;
        //For marks 75-84, Grade is D
        case (mark>=75 && mark<=84):
            grade="D";
            break;
        //For marks 65-74, Grade is C
        case (mark>=65 && mark<=74):
            grade="C";
            break;
        //For marks 50-64, Grade is P
        case (mark>=50 && mark<=64):
            grade="P";
            break;
        //For marks 49-0, Grade is HD
        case (mark<=49 && mark>=0):
            grade="F";
            break;






    }
    return grade;
}
public boolean pass(int mark) {
    boolean pass = false;
// code to determine pass goes here

    return pass;
    } 
}

I


1
只需使用 if/else if/else if/.../else。在Java中,switch语句不会做到这一点。 - Jon Skeet
还要注意的是,如果你知道方法的结果,最简单的方法就是立即返回,而不是使用你的 grade 局部变量。 - Jon Skeet
6个回答

2

Switch语句中的case只能取常量值,不能添加运行时计算的表达式。

在这种情况下,最好使用传统的if-else-if语句。

 public String grade(int mark) {
        String grade = null;
        // code to determine grade goes here
        if (mark >= 100 && mark <= 85) {
            grade = "HD";
        } else if (mark >= 75 && mark <= 84) {
            grade = "D";
        } else if (mark >= 65 && mark <= 74) {
            grade = "C";
        } else if (mark >= 50 && mark <= 64) {
            grade = "P";
        } else if (mark <= 49 && mark >= 0) {
            grade = "F";
        } else {
            grade = "Not found";
        }
        return grade;
    }

我认为最好的做法是修复原帖中提供的代码,这样就没有必要使用伪代码了。 - Jon Skeet
@DavidWallace 抱歉,复制粘贴了 OP 的条件 :) - Suresh Atta

0

对于这种情况,肯定要用if-else语句。 顺便说一下,你的switch语句是错误的。


0

如果你真的想使用 switch 语句,你可以将 mark 除以 10 并让 case 10 和 case 9 等于 A,然后你可以在 case 8 到 case 5 中放置 if 条件语句,default 情况下为 f。


0

不幸的是,Java没有像Javascript一样的switch-ranges,因此获得所需结果的一种方法是将mark除以10并进行四舍五入(例如8.5变为9等)。然后,对于从0到10的每个数字,都有一个相应的case,如下所示:

double markDividedByTen = mark/10.0;
int mark = (int) (markDividedByTen + 0.5); //round to whole number
switch (mark){
        case 10:
            grade="HD";
            break;
        case 9:
            grade="HD";
            break;
        case 8:
            grade="D";
            break;
        case 7:
            grade="C";
            break;
        case 6:
            grade="P";
            break;
        case 5:
            grade="P";
            break;
        case 4:
            grade="F";
            break;
        case 3:
            grade="F";
            break;
        case 2:
            grade="F";
            break;
        case 1:
            grade="F";
            break;
        case 0:
            grade="F";
            break;
    }

这种方法唯一的问题是,45到49分数段实际上应该获得“P”等级,但我想向您展示一种替代的if/else if语句的方法,仍然利用了switch语句。

0

你可以使用if-else语句来实现,因为switch不能有表达式。你可以这样做。

public class Grader {
   // no attributes required
    public Grader() {
// no code required
}


public String grade(int mark) {
    String grade = null;
// code to determine grade goes here
    if(mark>=85 && mark<=100)
    {
     grade = "HD";
    }
  else if(mark>=75 && mark<=84)
  {
    grade = "D";
  }
  else if(mark>=65 && mark<=74)
  {
    grade = "C";
  }
  else if(mark>=50 && mark<=64)
  {
    grade = "P";
  }
  else if(mark>=0 && mark<=49)
  {
    grade = "F";
  }
  return grade;

}
public boolean pass(int mark) {
    boolean pass = false;
// code to determine pass goes here

    return pass;
    } 
}

0
问题在于您尝试生成布尔值,同时检查语句是否小于或大于某些值。在 switch 中,如果您正在迭代整数值类型,则无法控制它。
if (100 >= mark && 85 <= mark) {
        // grade ...
    } else if (84 >= mark && 75 <= mark) {
        // grade ...
    } else if (74 >= mark && 65 <= mark) {
        // grade ...
    } else if (64 >= mark && 50 <= mark) {
        // grade ...
    } else if (49 >= mark && 0 <= mark) {
        // grade ...
    } else if (-1 >= mark || 101 <= mark) {
        // Error,mark cannot be lower than 0 and higher than 100 
    }

这应该可以解决你的问题。但是还有许多方法可以避免多个检查语句。可以尝试使用枚举映射技术。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接