检查值为'ceiling'值并返回相应的变量

时间:2011-11-03 15:50:43

标签: java if-statement implementation

我有一些常量f.e。:

BigDecimal ceiling1 = new BigDecimal(5);
BigDecimal ceiling2 = new BigDecimal(10);
BigDecimal ceiling3 = new BigDecimal(20);

BigDecimal rate1 = new BigDecimal(0.01);
BigDecimal rate2 = new BigDecimal(0.02);
BigDecimal rate3 = new BigDecimal(0.04);
BigDecimal rate4 = new BigDecimal(0.09);

现在基于参数f.e。:

BigDecimal arg = new BigDecimal(6);

我想检索基于此if结构(简化)的正确率:

if(arg <= ceiling1) {
   rate = rate1;
}else if(arg <= ceiling2) {
   rate = rate2;
} else if (arg <= ceiling3) {
   rate = rate3;
}else rate = rate4;

因此,在我的示例中rate应为rate2

但是我想知道是否有人知道更好的方法来实现它,而不是一堆ifs。

欢迎任何指示!

PS:我知道我的代码不是100%正确,只是想展示这个想法

3 个答案:

答案 0 :(得分:4)

您可以将天花板存储为TreeMap中的键,将价格存储为值。然后使用floorEntry并查看here

final TreeMap<BigDecimal, BigDecimal> rates = new TreeMap<BigDecimal, BigDecimal>();
rates.put(new BigDecimal(0), new BigDecimal(0.01));
rates.put(new BigDecimal(5), new BigDecimal(0.02));
rates.put(new BigDecimal(10), new BigDecimal(0.04));
rates.put(new BigDecimal(20), new BigDecimal(0.09));

System.out.println(rates.floorEntry(new BigDecimal(0)).getValue());
System.out.println(rates.floorEntry(new BigDecimal(6)).getValue());
System.out.println(rates.floorEntry(new BigDecimal(10)).getValue());
System.out.println(rates.floorEntry(new BigDecimal(100)).getValue());

测试:http://ideone.com/VrucK。您可能希望使用不同的表示,因为您可以在测试中看到它看起来很丑陋(如天花板的整数)。顺便说一句,丑陋的输出来自0.01是双which does funny things with decimal representations的事实。

修改:建议cleanup

答案 1 :(得分:1)

我可能会摆脱BigDecimal对象并将速率(和上限)存储为CONSTANTS(FINAL变量)。 然后我将使用Switch语句来找到合适的费率。

答案 2 :(得分:1)

class RateCalculator {
  double ceiling[] = new double[]{5,10,20};
  double rate[] = new double[]{0.01,0.02,0.04}
  // use assertions to ensure that the sizes of these two arrays are equal.
  // ensure that successive values in ceiling are higher than the last.
  public double calculateRate(double value) {
    for (int i=0;i<ceiling.length;++i) {
      if (value < ceiling[i]) {
        return rate[i];
      }
    // the rate for values higher than the highest ceiling
    return 0.09;
  }
}

您可以通过更改数组的大小来更改费率。一些值应该被命名为常量以遵循良好的编程风格 - 它们在这里留下数字来说明OPs值与这里的值之间的对应关系。

转换为BigDecimal是留给读者的练习。