我必须使用switch case语句在JAVA中编写一个程序。我需要使用switch case语句检查以下条件。但是我无法比较switch case语句中的值,我该怎么做呢。
if Avarage - AVG
AVG ≥ 3.50 “A Pass”
3.49 ≥ AVG ≥ 3.00 “B Pass”
2.99 ≥ AVG ≥ 2.50 “C Pass"
2.49 ≥ AVG ≥ 2.00 “D Pass”
2.00 ≥ AVG “Fail”
答案 0 :(得分:2)
您可以使用一系列if语句,也可以使用实现NavigableMap接口的TreeMap。它可能看起来像:
TreeMap<Double, String> map = new TreeMap<>();
map.put(0d, "Fail");
map.put(2d, "D Pass");
map.put(2.5, "C Pass");
map.put(3d, "B Pass");
map.put(3.5, "A Pass");
System.out.println(map.floorEntry(1.9).getValue()); //Fail
System.out.println(map.floorEntry(2.49).getValue()); //D
System.out.println(map.floorEntry(2.5).getValue()); //C
System.out.println(map.floorEntry(3d).getValue()); //B
System.out.println(map.floorEntry(3.5).getValue()); //A
回到您的示例,您只需致电return map.floorEntry(AVG).getValue();
。
性能方面非常接近,特别是只有5种不同的情况。我留给你决定哪个更具可读性。
答案 1 :(得分:0)
Switch在内部使用跳转表,这就是case语句只能测试精确值和最终值的原因。你可以这样想象:
result = jumpTable[key]; // switch pseudo-code
这不是你在编译代码中可以找到的,但它一般是相同的想法,所以我用它来回答你的问题。
无法访问此数组中没有的任何索引,因此如果您有一个长度为5的数组,则无法执行以下操作:
result = jumpTable[2.3]; // impossible in Java
因为这只是没有定义,Java无法神奇地弄清楚你真的想要向下舍入到2.要归档你需要编写一个能够理解和转换中间值的函数,例如一个简单的楼层函数
result = jumpTable[floor_int(2.3)]; // a solution for a specific case
对某些情况,会做的伎俩。很明显,所使用的函数需要实际适合你的问题,所以如果2.3应该指向索引1,你显然需要在场景后面使用不同的数学。
正如assylias写的那样,TreeMap的方法floorEntry
是我上面写的内容的一般化版本,可以用来解决你的问题。
另一种选择是像这样的标准if-else链:
String getTestResult(final double avg) {
if (avg >= 3.5) {
return "A Pass";
} else if (avg >= 3.0) {
return "B Pass";
} else if (avg >= 2.5) {
return "C Pass";
} else if (avg >= 2.0) {
return "D Pass";
} else {
return "Fail";
}
}
这使用了数字的自然顺序,它表明(显然)avg
不能同时> = 3.5和<= 3.5。
对于您的情况,您应该只编写一个函数gradeToIndex
,然后使用它来代替上面示例中的floor_int
函数,例如
index = (int) Math.round((avg - 2.0) * 2.0);