【问题标题】:Avoiding a large amount of if-else statements in java避免在 java 中使用大量 if-else 语句
【发布时间】:2014-03-18 05:46:31
【问题描述】:

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

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

如果超过10万,税率为40%

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

3万以上小于等于6万,税率为20%

15000以上30000以下,税率为10%

超过5000且小于等于15000,税率为5%

如果工资小于等于5000,税率为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);
}}

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

【问题讨论】:

  • 我不认为你可以在这里使用“开关”。开关仅适用于特定情况。所以,是的,这是“目前”代码的最佳实践
  • Guava 和/或 Apache Commons 已排序地图容器,允许键之间的匹配范围。看起来像是那些的用例。

标签: java if-statement


【解决方案1】:

正如 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 语句可能会比映射的开销更快。然而,在一个逐年添加税级的世界中(谢天谢地,不那么频繁),像上面这样更具动态性的方法会很有帮助。

【讨论】:

  • 这是一个比她所做的更好的设计。但是这和一组 if-else 语句一样有效吗?
  • 不,它肯定会更慢(尽管对人类来说不是,即使你每次都重新实例化Map)。 if 语句系列将击败任何与 if 语句相同的数据结构,但您也无法在不更改代码的情况下更改它们的数量;您可以即时更改、添加或删除地图中的项目(添加潜在问题,例如线程安全)。任何增加的复杂性都会有所取舍。
  • 就像我说的.. 它的设计更好,也许是最好的.. 是的,我同意额外的复杂性/灵活性,带来额外的延迟。 :)
  • 这非常有用
【解决方案2】:

使用一个能给出下限和/或上限以及乘数的表格。然后只需扫描表格,直到找到合适的行并使用该乘数。

在实际应用程序中,该表将位于数据库中,因为它可以随时更改范围、范围数和乘数。

【讨论】:

  • 按表格,他可能是指TreeMap&lt;Double, Double&gt;。使用 TreeMap,您可以轻松地使用floorEntry 来获取包含与其税率(值)匹配的薪水(键)的Entry
【解决方案3】:

你总是可以这样做的。 它避免了大量的 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;
    }

}

【讨论】:

  • 如果支付值为 10001d
  • 100,001 是否大于 100,000?它将返回 0.4 天。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多