找到数字所在的范围

时间:2010-02-05 15:14:21

标签: java performance

我有以下方法:

private static final int OPEN_FOR_RAISE_RANGE = 35;
private static final int OPEN_FOR_CALL_RANGE = 25;

public void foo(double num){
    if(num <= OPEN_FOR_RAISE_RANGE){
        //do something
    }
    else if(num <= (OPEN_FOR_RAISE_RANGE + OPEN_FOR_CALL_RANGE)){
        //do something else 
    }
    //etc
}

基本上检查数字落入的范围并采取适当的行动。我想知道除了很多if之外是否有更好/更有效的方法来做到这一点?

由于

4 个答案:

答案 0 :(得分:3)

从commons-lang查看NumberRange

NumberRange range = new NumberRange(
  OPEN_FOR_RAISE_RANGE,
  OPEN_FOR_RAISE_RANGE + OPEN_FOR_CALL_RANGE
);

if(range.containsNumber(num)) {
  // do this
} else {
  // do something else
}

答案 1 :(得分:1)

这跟我想的一样好。

请注意,编译器会在编译时将OPEN_FOR_RAISE_RANGE + OPEN_FOR_CALL_RANGE计算替换为值60,因此您不会在每次调用时计算此值。

答案 2 :(得分:1)

我觉得很好,如果if语句是这样嵌套的话会更麻烦:

if (...) {
   if (...) ...;
   else (...) { ... }
   if (...)
      if (...)
         if (...) ...;
         else (...) ...;
}

然后你真的应该考虑将代码分解为他们自己的方法。

答案 3 :(得分:0)

如果你有大量的if / ifelse / ifelse /.../ else语句,这样的话会有所帮助:

public interface Choice {
    public boolean check(int value);
    public void action(int value);
}

public class BelowRange implements Choice {
    public static boolean check(int value) {
        return (value < 10);
    }
    public void action(int value) {
        // Do something;
    }
}

public class Range1 implements Choice {
    public boolean check(int value) {
        return (value > 10 && value < 50);
    }
    public void action(int value) {
        // Do something;
    }
}

...

在您的代码中:

List<Choice> choices = new ArrayList<Choice>();
choices.add(new BelowRange());
choices.add(new Range1());

...

for (Choice choice : choices) {
    if (choice.check(value)) {
        choice.action(value);
    }
}

我可能会实现它,所以选择的实现可能是静态方法,而不是必须实例化它们,但事情的要点就在那里。

如果编译器对此进行了大量优化,特别是使用静态方法,它应该不会更慢,并且从开发人员的角度来看,它会使嵌套的if / else结构更易于维护。