2014-12-08 5 views
1

У меня есть double, и у меня есть несколько проверок, если инструкции для проверки значения передаются между двумя значениями. напримерБолее эффективный способ выполнения нескольких операторов if else

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 из них, если проверки и, кажется, очень неэффективно и думал идентификатор спросить, есть ли более эффективный способ вычисления возвращаемого значения?

+2

переключатель случай? нет? –

+1

использовать цикл for, поскольку они кратные 5, а затем возвращают индекс ?? – jcjunction

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

Это кажется лучше, в моем фактическом коде проверка диапазона - 22,5, так что я считаю, что я разделил бы на 22,5 вместо 5? –

+0

Да, это сработает. –

+0

Я использовал ваш более короткий подход, так как верхний предел был бы равен 360, поэтому каждый оператор if имел бы диапазон 22,5. Я протестировал его там сейчас, похоже, возвратил те же ответы, что и у всех операторов if. Огромное спасибо! –

1

Вы можете разделить на 5 и вернуть интегральный ответ.

+3

Вы должны показать пример в коде. – csmckelvey

0

После следует сделать работу:

return (int)(d/5); 

Вы можете потребовать связанного проверку нижнего предела (< 0), так что мы можем иметь дело следующим образом:

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

Это не работает. 1,0% 5 = 1, а не 0 –

+0

Да, на втором, хотя разделить на 5 подходит лучше. –

0

похоже, вы реализуете floor division по 5. Вы можете сделать это более кратко:

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

Другие ответы имеют более простые решения, например. по модулю бизнеса. Но в целом, если все ваши условия являются последовательными и не перекрываются, вам не нужно несколько различны, если() тесты - нужно просто один, если/еще/еще/... цепь:

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 нижняя граница уже рассмотрена предыдущим тестом.

+0

хорошо пункт. исправлено. –

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' 
0

Мой подход к сокращению Если условие

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


} 
Смежные вопросы