繁体   English   中英

如何减少“else if”语句?

[英]How do I reduce "else if" statements?

有没有办法减少“else if”语句? 我的任务是制作一个程序,要求用户输入 3 个等级,然后确定这些数字的平均值,这也将 output 根据他们给出的表格计算出的平均值的等效等级。

到目前为止,这是我的代码。

if (ave >= 98){
    System.out.println("Your grade is 1!");
}
else if (ave >= 95){
    System.out.println ("Your grade is 1.25!");
}
else if (ave >= 92){
    System.out.println ("Your grade is 1.5!");
}   
else if (ave >= 89){
    System.out.println ("Your grade is 1.75!");
}
else if (ave >= 86){
    System.out.println ("Your grade is 2!");
}     
    

如果有平滑的 function (对于ave的每 3 个点的差异,坡度增加 0.25 分),应根据最小 86 和最大 98 的检查值计算坡度值:

static double getGrade(int ave) {
    final int min = 86;
    double grade = 2.0;
    
    int p = (ave - min) / 3;
    p = p < 0 ? 0 : (p > 4 ? 4 : p); // acceptable ranges
    grade -= p * 0.25;
    
    System.out.println ("Your grade for ave = " + ave + " is " + grade + "!");
    return grade;
}

测试:

getGrade(99);
getGrade(94);
getGrade(86);

Output:

Your grade for ave = 99 is 1.0!
Your grade for ave = 94 is 1.5!
Your grade for ave = 86 is 2.0!

对于评论中提供的更新公式:

1.0 = 98 – 100 %, 1.25 = 95 – 97 %, 1.5 = 92 – 94 %, 1.75 = 89 – 91 %, 2.0 = 86 – 88 %, 2.25 = 83 – 85 %, 2.5 = 80 – 82 %, 2.75 = 77 – 79 %, 3.0 = 75 – 76 %, 5.0 = 平均低于 75 %

需要修改代码以提供低于 75 和介于 75..77 之间的值:

static double getGrade(int ave) {
    double grade = 5.0;
    if (ave >= 75) {
        grade = 3.0;
        final int stepAve = 3;
        final int min = 77;
        final int ranges = 7;
        
        int p = ave < min ? -1 : (ave - min) / stepAve;
        p = p < 0 ? -1 : (p > ranges ? ranges : p); // acceptable ranges
        grade -= (p + 1) * 0.25;
    }
    
    System.out.println ("Your grade for ave = " + ave + " is " + grade + "!");
    return grade;
}    

测试:

for (int i = 72; i < 100; i += 3) {
    getGrade(i);
}

结果:

Your grade for ave = 72 is 5.0!
Your grade for ave = 75 is 3.0!
Your grade for ave = 78 is 2.75!
Your grade for ave = 81 is 2.5!
Your grade for ave = 84 is 2.25!
Your grade for ave = 87 is 2.0!
Your grade for ave = 90 is 1.75!
Your grade for ave = 93 is 1.5!
Your grade for ave = 96 is 1.25!
Your grade for ave = 99 is 1.0!

在这种情况下,您可以提取更改的变量,将它们放在集合中,然后循环遍历集合。 在你的情况下,我会做类似的事情:

int[] threshold = new int[]{98,95,..};
String[] descr = new String[]{"1","1.25",..}

for(int i = 0; i < threshold.length; i++) {
    if(ave >= threshold[i]) {
        print("Your grade is " + descr[i]);
        break;
    }
}

我会推荐一个NavigableMap到 map 较低的平均成绩。
就像是

/** Maps lower average to corresponding grade. */
static final NavigableMap<Integer, String> GRADES =
    Collections.unmodifiableNavigableMap( new TreeMap<>( Map.of(
        98, "1", 
        95, "1.25", 
        92, "1.5", 
        89, "1.75", 
        86, "2",
        Integer.MIN_VALUE, "not specified"    // avoid null check
    )));

String grade(int average) {
    return GRADES.floorEntry(average).getValue();
}

最后一项只是针对平均值小于86的情况,显然可以根据需要更改。 map 中也可以有Double s 而不是String s。

对于多个 if..else if..else。 始终建议使用 switch 语句。

public void DisplayGrade(int range)
{
    switch (range)
    {
        case  >= 98 :
          System.out.println ("Your grade is 1!");
        break;

        case >= 95:
           System.out.println ("Your grade is 1.25!");
        break;
        case  >= 92 :
           System.out.println ("Your grade is 1.5!");
        break; 
        case >= 89 :
           System.out.println ("Your grade is 1.75!");
        break;
        case >= 86:
           System.out.println ("Your grade is 2!");
        break; 
    }
} 

减少else-if数量的唯一方法是在需要唯一输出的点之后切断并添加else语句以避免超出指定范围的输入:

if (ave >= 98){
    System.out.println("Your grade is 1!");
}
else if (ave >= 95){
    System.out.println ("Your grade is 1.25!");
}
else if (ave >= 92){
    System.out.println ("Your grade is 1.5!");
} 
else { //for example. if you do not need a custom output range below avg of 92...
    System.out.println("Your grade is {whatever else it can be}");
}

正如评论中指出的那样,您的代码已经足够简化了。 您可以尝试使用 switch 语句,但我认为这不值得麻烦,因为您的代码应该可以正常工作并且不会采取不必要的步骤。 你所需要的只是最后的一个else语句。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM