如何避免多个if语句

时间:2018-07-30 11:49:21

标签: java algorithm if-statement

我有下一个代码:

private static final List<String> VALUES =
  ImmutableList.of("15", "545", "856", "5", "4558"); 

public int getAmountOfUnits(String value, int duration) {

    if (VALUES.contains(value)) {

        if (duration >= 1 && duration <= 7) 
            return 0;

        if (duration >= 8 && duration <= 82) {
            return getUnitAmount(duration, 22, 15, 1);
        }

        if (duration >= 83 && duration <= 90) 
            return 7;

        if (duration >= 91) {
            return getUnitAmount(duration, 114, 24, 7);
        }
    }


    if (value.equalsIgnoreCase("3") && duration >= 0) {
        return getUnitAmount(duration, 15, 16, 1);
    }

    if (value.equalsIgnoreCase("4") && duration >= 0) {
        return getUnitAmount(duration, 59, 60, 0);
    }

    return 1;
}

列表项

private int getUnitAmount(int input, int startRange, int increment, int startUnit) {
  while (startRange < input) {
    startUnit++;
    startRange += increment;
  }
  return startUnit;
}

如果有陈述,我如何避免出现此多行?

2 个答案:

答案 0 :(得分:0)

IMO几乎没有什么可以保留的,因为不同的条件总会涉及不同的代码。您可以重新组织四个持续时间的测试,以二分法搜索,但是收益很小。

答案 1 :(得分:0)

您将需要那些if条件,但是您可以减少一些检查并生成更紧凑的代码。性能差异虽然可以忽略不计。

public int getAmountOfUnits(String value, int duration) {
    if(duration < 0) return 1; // here you can return whatever you intend to do.
    if (VALUES.contains(value)) {    
        if (duration <= 7){ 
            return 0;
        }else if (duration <= 82) {
            return getUnitAmount(duration, 22, 15, 1);
        }else if (duration <= 90){ 
            return 7;
        }else{
            return getUnitAmount(duration, 114, 24, 7);
        }
    }



        if(value.equals("3")){
            return getUnitAmount(duration, 15, 16, 1);
        }else if(value.equals("4")){
            return getUnitAmount(duration, 59, 60, 0);
        }


    return 1;
}