簡體   English   中英

執行多個if else語句的更有效方法

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM