正如其他人指出的那样,一个switch-case声明旨在具有离散/枚举值,这使得它与double数据类型不兼容使用。如果我理解正确的想法,你会希望你的程序很好地转化考试点到等级,你可以使用一个enum定义的最低点,每个等级:
enum Grade {
A(92.5), B(82.5), C(72.5), D(62.5), E(52.5), F(0.0);
private static final Grade[] GRADES = values();
private double minPoints;
Grade(double minPoints) {
this.minPoints = minPoints;
}
public static Grade forPoints(double points) {
for (Grade g : GRADES) {
if (points >= g.minPoints) {
return g;
}
}
return F;
}
}
在Grade的forPoints()方法可以让你查找与考试点相对应的等级。
现在,为了跟踪成绩的数量,您可以使用EnumMap而不是个别的计数器变量。请注意,由于查找被编码到enum,你不再需要switch-case:
Map gradeCounters = new EnumMap<>(Grade.class);
// initialize the counters
for(Grade g : Grade.values()) {
gradeCounters.put(g, 0);
}
Scanner input = new Scanner(System.in);
double total = 0;
int gradeCounter = 0;
double points = input.nextDouble(); //read exam points
while (points >= 0) {
total += points; // add points to total
++gradeCounter; // increment number of grades
// increment appropriate letter-grade counter
Grade g = Grade.forPoints(points);
int currentCount = gradeCounters.get(g);
gradeCounters.put(g, currentCount + 1);
points = input.nextDouble();
}