[英]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.