在java中避免大量的if-else语句

时间:2014-03-18 05:46:32

标签: java if-statement

所以我正在做练习测试,这就是问题:

编写一个Java方法,该方法将一个double value pay作为参数并打印 到标准输出的税率对应于输入的薪酬值。 使用下表确定税率。 (6分)

如果支付超过100,000,税率为40%

如果支付超过60,000且小于或等于100,000,则税率为30%

如果支付超过30,000且小于或等于60,000,则税率为20%

如果支付超过15,000且小于或等于30,000,则税率为10%

如果支付超过5,000且小于或等于15,000,则税率为5%

如果工资小于或等于5,000,则税率为0

这是我写的代码,有效:

public class Two {

public static void main(String[] args){
    double j= Double.parseDouble(args[0]);
    Two.taxrate(j);}

public static void taxrate(double pay)
{
    if (pay> 100000) {System.out.println(pay*.4);}
    else if (pay>60000) {System.out.println(pay*.3);}
    else if (pay>30000) {System.out.println(pay*.2);}
    else if (pay>15000) {System.out.println (pay*.1);}
    else if (pay>5000) {System.out.println(pay*.05);}
    else System.out.println(0.0);
}}

我想知道的是:这是回答这个问题的最佳方式吗?我们已经学会了如何设计数据类型,这个问题似乎很简单。我觉得我忽略了一些东西。

3 个答案:

答案 0 :(得分:4)

使用提供较低和/或上限和乘数的表。然后只需扫描表格,直到找到合适的行并使用该乘数。

在实际应用中,表格将位于数据库中,因为权力随时可以改变范围,范围数和乘数。

答案 1 :(得分:4)

正如EJP建议的那样,你想要一份工资与税率的“表格”。在完整规模的应用程序中,此信息可能存储在数据库中而不是存储在内存中,但是在静态定义和完整规模数据库之间的某些内容将使用Map。具体来说,使用NavigableMap将允许非常简单地访问此类计算:

NavigableMap<Double, Double> payToTaxRate = new TreeMap<Double, Double>();

// e.g., loaded from a file:
payToTaxRate.put(100000, 0.4);
payToTaxRate.put(60000, 0.3);
payToTaxRate.put(30000, 0.2);
payToTaxRate.put(15000, 0.1);
payToTaxRate.put(5000, 0.05);
payToTaxRate.put(Double.MIN_VALUE, 0);

System.out.prinln(pay * payToTaxRate.floorEntry(pay).getValue());

当然,对于赋值而言,这是过度的,if语句可能比映射的开销更快。然而,在一个每年逐字增加税率(不常见,幸亏)的世界中,像上述这样更有活力的方法是有帮助的。

答案 2 :(得分:2)

你总是可以这样做。 它避免了大量的if块,并且还增加了更好的结构。

import java.util.HashMap;
import java.util.Map;

public class Two {

    private static Map<Double, Double> rates = new HashMap<Double, Double>();
    static {
        rates.put(100000d, 0.4d);
        rates.put(60000d, 0.3d);
        rates.put(30000d, 0.2d);
        rates.put(15000d, 0.1d);
        rates.put(5000d, 0.05d);
    }

    public static void main(String[] args) {
        double j = Double.parseDouble(args[0]);
        System.out.println(rate(j));
    }

    private static double rate(double pay) {
        for(Double d: rates.keySet())
            if(pay > d) return pay * rates.get(d);
        return 0.0d;
    }

}