Java 如何在Switch case语句中使用范围检查

Java 如何在Switch case语句中使用范围检查,java,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” 您可以使用一系列if语

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

您可以使用一系列if语句,也可以使用实现NavigableMap接口的。它可能看起来像:

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
TreeMap map=newtreemap();
映射放置(0d,“失败”);
地图放置(2d,“D通行证”);
地图放置(2.5,“C通行证”);
地图放置(3d,“B通行证”);
地图放置(3.5,“通行证”);
System.out.println(map.floorEntry(1.9.getValue())//失败
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.
回到您的示例,您可以简单地调用
returnmap.floorEntry(AVG.getValue()


性能方面,它将非常接近,尤其是只有5种不同的情况。我让您决定哪个更可读。

开关在内部使用跳转表,这就是为什么case语句只能测试精确值和最终值。你可以这样想象:

result = jumpTable[key]; // switch pseudo-code
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";
  }
}
这不是您在编译的代码中会发现的,但总体上是相同的想法,所以我用它来回答您的问题

无法访问不在此数组中的任何索引,因此如果数组长度为5,则无法执行以下操作:

result = jumpTable[2.3]; // impossible in Java
因为这只是没有定义,Java无法神奇地发现您实际上想要舍入到2。要存档,您需要编写一个能够理解和转换中间值的函数,例如一个简单的floor函数

result = jumpTable[floor_int(2.3)]; // a solution for a specific case
在某些情况下会起作用。显然,所使用的函数实际上需要适合您的问题,因此如果2.3应该指向索引1,那么您显然需要在幕后使用不同的数学

正如assylias所写,a的方法
floorEntry
是我上面所写的方法的一个广义版本,可以用来解决您的问题

另一种选择是标准的if-else链,如下所示:

result = jumpTable[key]; // switch pseudo-code
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,但我必须使用Switch-Case语句,这是一个需要使用Switch-Case语句的问题。有人能帮我吗?@astrodileepa如果avg可以是任意双精度的,这不能用Switch语句来写。如果仅授权某些值(例如0、0.5、1、1.5、2、2.5、3、3.5),则可能。您需要提供更多信息。是的,我知道我们不能使用switch case语句来比较值。但这是一个具有挑战性的问题。规则是不要使用if..else语句。我不知道如何处理这种情况。这是一个非常棘手的问题。