如何在Switch case Statements中使用Range检查

时间:2014-01-27 14:22:28

标签: java

我必须使用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” 

2 个答案:

答案 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);