[英]More efficient way of doing multiple if else statements
我有一个双精度,并且我有多个检查,如果要检查的值传递的语句位于两个值之间。 例如
double d = 5.0;
if(d >= 0.0 && d < 5.0)
{
return 0;
}
if(d >= 5.0 && d < 10.0)
{
return 1;
}
if(d >= 10.0 && d < 15.0)
{
return 2;
}
我有大约15种if检查,效率似乎很低,想想想知道是否有更有效的方法来计算返回值?
如果您的界限是完全任意的(与您发布的示例不同),那么您的成语几乎就是您所能获得的。 您应该消除多余的下限检查。 首先确保结果为正,然后再测试上限。 如果您使用三元运算符,并且格式正确,则可以获得非常简洁易读的代码:
if (d < 0) throw new IllegalArgumentException("Argument was negative");
if (d > UPPER_LIMIT) throw new IllegalArgumentException("Argument too large");
return d < THRESHOLD_0? 0
: d < THRESHOLD_1? 1
: d < THRESHOLD_2? 2
: d < THRESHOLD_3? 3
: 4;
但是,如果您的边界与示例中介绍的边界一样规则,并且不会改变,那么例如利用该规则当然会有所回报
if (d < 0) throw new IllegalArgumentException("Argument was negative");
if (d > UPPER_LIMIT) throw new IllegalArgumentException("Argument too large");
return (int) (d / 5);
您可以除以5并返回整数答案。
以下应该做的工作:
return (int)(d / 5);
您可能需要对下限(<0)进行绑定检查,因此我们的情况如下:
if (d > 0)
return (int)(d / 5);
throw new IllegalArgumentException("Argument was negative");
它看起来像你实现地板师由5
。 您可以像这样更简洁地进行操作:
double d = 5.0;
return (int)d / 5;
其他答案有更简单的解决方案,例如模数业务。 但是总的来说,如果所有条件都是连续且不重叠的,则不需要多个不同的if()测试-您只需要一个if / else / else / ...链:
if (d >= 0 && d < 5.0) {
return 0;
} else if (d < 10.0) {
return 1;
} else if (d < 15) {
return 2;
} else {
throw("out of range"); // or whatever should happen.
}
持续测试d的“下限”毫无意义。 使用if / else结构时,先前的测试已经考虑到了下限。
根据d的值,您可能需要在除法之前对其进行更改。 否则,int结果将被截断(不舍入)。 就像是:
double d = 4.99999;
System.out.println((long)(d / 5)); // Prints out '0'
d += 0.1;
System.out.println((long)(d / 5)); // Prints out '1'
我减少If条件的方法
import java.util.LinkedHashMap;
import java.util.Map;
public class Main {
public static void main(String[] args) {
Double number = 6.0;//number to search
Map<Double, Double> numberRange = new LinkedHashMap<Double, Double>();
numberRange.put(0.0, 5.0);
numberRange.put(5.0, 10.0);
numberRange.put(10.0, 15.0);
// And So on
int status = getStatusOfNumberInRange(number, numberRange);
System.out.println(status);
}
private static int getStatusOfNumberInRange(Double number, Map<Double, Double> numberRange) {
int countStatus = 0;
for (Double minNum : numberRange.keySet()) {
if (checkNumberInRange(minNum, numberRange.get(minNum), number)) {
break;
}
countStatus++;
}
return countStatus;
}
private static boolean checkNumberInRange(Double minNum, Double maxNum, Double number) {
if (number >= minNum && number < maxNum) {
return true;
}
return false;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.