else语句?

wb1gzix0  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(202)

有没有一种方法可以减少用JavaNetBean编写的大量条件下的代码量?我使用了if else语句和很多条件,并意识到我的代码相当长。条件来自组合框和文本字段(尚未添加)。
我在底部有一个代码示例。我需要添加20+这个,所以我不知道如果else语句是唯一的选择。

if (RegionBx.getSelectedItem().equals("Tokyo") &&
        SeasonBx.getSelectedItem().equals("Spring") && 
        MealBx.getSelectedItem().equals("Nil")) {
          TravelCost = Tokyo + (Tokyo * sphotel) + (Tokyo * spflight);
    }
d4so4syb

d4so4syb1#

没有这样的模式,可以减少 if-else 每种架构的声明。
对于您的任务类型,您应该简单地将字符串Map到价格。
摆脱使用条件句的需要。使用集合将可能的输出数据与可能的输入数据关联起来。

Map<String, Integer> cityPrices = HashMap<String, Integer>();
 Map<String, Integer> seasonPrices = HashMap<String, Integer>();
 Map<String, Integer> mealPrices = HashMap<String, Integer>();

 // Don't forget to initialize your collections. 
 // Put possible string values and their prices in maps.

 cityPrices.put("Tokyo", 10000);
 ...

 Integer regionPrice = cityPrices.get(RegionBx.getSelectedItem()); 
 Integer seasonPrice = regionPrice * seasonPrices.get(SeasonBx.getSelectedItem());
 Integer mealPrice = regionPrice * mealPrices.get(MealBx.getSelectedItem());

 Integer travelCost = regionPrice + seasonPrice + mealPrice; // Now it is one line for all cases.
fae0ux8s

fae0ux8s2#

很难说没有看到你要解决的全部问题。但是如果这些测试的模式非常一致,那么您可以尝试多种方法。例如

switch (regionBx.getSelectedItem() + ":" +
        seasonBx.getSelectedItem() + ":" +
        mealBx.getSelectedItem()) {
case "Tokyo:Spring:Nul":
    travelCost = tokyo + (tokyo * sphotel) + (tokyo * spflight);
    break;
...
}

或:

String[][] criteria = new String[][]{
    {"Tokyo", "Spring", "Nul"},
    ...
};
IntSupplier[] computations = new IntSupplier[] {
    () -> tokyo + (tokyo * sphotel) + (tokyo * spflight),
    ...
};

String region = regionBx.getSelectedItem();
String season = seasonBx.getSelectedItem();
String meal = mealBx.getSelectedItem();
for (int i = 0; i < criteria.length; i++) {
    if (region.equals(criteria[i][0]) &&
        season.equals(criteria[i][1]) &&
        meal.equals(criteria[i][2])) {
        travelCost = computations[i]();
        break;
    }
}

(我不确定第二个版本的语法是否完全正确。请评论或编辑。)
如果您可以将计算表示为一个基于一组有限因子的公式,这些因子可以在Map中查找,请参见@steyrix的答案。
但是,还不清楚结果是否会比具有大量数据的版本更好(更可读/更易维护) if 测验。
而且他们不太可能更有效率。
我个人的建议是 if 在第一个版本中进行测试,如果方法扩展到数百行代码,则只需在“抛光”代码上花费精力。

相关问题