执行多个if else语句的更有效方法

时间:2014-12-08 17:35:31

标签: java if-statement conditional-statements

我有一个double,我有多个检查if if语句来检入传入的值是在两个值之间。例如

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个这样的检查,看起来非常低效,并且认为id询问是否有更有效的方法来计算返回值?

7 个答案:

答案 0 :(得分:3)

如果您的界限完全是任意的(与您发布的示例不同),那么您的习语几乎和您所能获得的一样快。您应该消除冗余的下限检查。首先确保结果为正,然后测试上限。如果您使用三元运算符,并使用正确的格式,您可以获得非常简洁和可读的代码:

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

答案 1 :(得分:1)

您可以除以5并返回积分答案。

答案 2 :(得分:0)

以下应该做的工作:

return (int)(d / 5);

您可能需要对下限(&lt; 0)进行绑定检查,因此我们可以按如下方式进行检查:

if (d > 0)
   return (int)(d / 5);
throw new IllegalArgumentException("Argument was negative");

答案 3 :(得分:0)

您似乎正在5实施floor division。你可以这样简洁地做到这一点:

double d = 5.0;
return (int)d / 5;

答案 4 :(得分:0)

其他答案有更简单的解决方案,例如模数业务。但一般来说,如果所有条件都是顺序且不重叠的,那么您不需要多个不同的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结构,下一个测试已经处理了下限。

答案 5 :(得分:0)

根据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'

答案 6 :(得分:0)

我减少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;
  }


}