如果你真的想要,你可以使用 switch 语句,通过使用枚举来表示不同的等级:
public class Main {
public static void main(String[] args) {
double gpa = Double.parseDouble(args[0]);
Grade grade = Grade.getGradeFromGPA(gpa);
switch (grade) {
case FIRST_CLASS: System.out.println("First class Hons"); break;
case TWO_ONE: System.out.println("upper Second class Hons"); break;
case TWO_TWO: System.out.println("Lower Second class Hons"); break;
case PASS: System.out.println("Pass"); break;
case FAIL: System.out.println("Fail"); break;
default: System.out.println("Invalied gpa");
}
}
private enum Grade {
FIRST_CLASS(3.5, 4),
TWO_ONE(3, 3.49),
TWO_TWO(2.5, 2.99),
PASS(2.49, 2),
FAIL(0, 1.99);
private final double minGPA;
private final double maxGPA;
Grade(final double minGPA, final double maxGPA) {
this.minGPA = minGPA;
this.maxGPA = maxGPA;
}
static Grade getGradeFromGPA(double gpa) {
for (Grade grade : Grade.values()) {
if (grade.maxGPA >= gpa && grade.minGPA <= gpa) {
return grade;
}
}
//invalid GPA
return null;
}
}
}
笔记:
- 我已将 Integer.parseInt 更正为 Double.parseDouble
- 我已经按照您的问题的方式保留了逻辑,但它确实对像 3.499 这样的输入会发生什么产生疑问 - 这将返回一个无效的成绩,因为它在 TWO_ONE 的最大值和 FIRST_CLASS 的最小值之间滑动
如果您真的使用枚举,您可能不会使用开关来打印成绩。你最好有一个代表成绩描述的字符串并打印出来,即:
public static void main(String[] args) {
double gpa = Double.parseDouble(args[0]);
Grade grade = Grade.getGradeFromGPA(gpa);
if (grade != null) {
System.out.println(grade.description);
} else {
System.out.println("Invalied gpa");
}
}
private enum Grade {
FIRST_CLASS(3.5, 4, "First class Hons"),
TWO_ONE(3, 3.49, "upper Second class Hons"),
TWO_TWO(2.5, 2.99, "Lower Second class Hons"),
PASS(2.49, 2, "Pass"),
FAIL(0, 1.99, "Fail");
private final double minGPA;
private final double maxGPA;
private final String description;
// remaining code omitted for brevity
}
这个故事的寓意是你不应该让你的编程锤(在本例中是 switch 语句)来驱动你的设计。你的代码应该反映你试图解决的问题,你不应该强迫你的问题变成代码的形式。