【问题标题】:Need advice for my java if-statement需要我的 java if 语句的建议
【发布时间】:2014-08-08 10:56:27
【问题描述】:

我希望能够使用这样的 if 语句:

int price = 60;
if (pizza.equals("string1","string2","string3")) { 
    int price2 = 10;
    System.out.println("You want " + pizza + " and it will cost " + price + price2  +" :-");
}
else if (pizza.equals("string1","string2") {
}

如果我输入的披萨被称为 string1、string2 或 string3,那么我想获得一个 int 值和一个名为 price2 的变量,然后以某种方式将其添加到 price (price + price2)。

【问题讨论】:

  • 对不起,我第一次来这里问了一个不好的问题而不是一个好看的问题:)
  • 使用 OR 逻辑运算符 (||):if(pizza.equals("string1") || pizza.equals("string2") || pizza.equals("string3")) {...}
  • 您应该改用 switch-case 语句(假设 Java7 或更高版本)。还请记录故意失败的案例。
  • 或者使用集合和contains(pizza)
  • ty 伙计们,只是一件小事,如果披萨等于其中一个字符串,我可以创建一个 int 变量吗?

标签: java string if-statement int


【解决方案1】:

不,这不是有效的 Java。你不能只是编造东西和希望。编译器会告诉你的。

你可以这样做:

private Map<String, Integer> prices = new HashMap<String, Integer>() {{
    put("cheese", 10);
    put("pepperoni", 15);
    put("five meat", 20);
}};

public int getPrice(String pizzaOrder) { 
    int price = 0;
    if ((pizzaOrder != null) && prices.keySet().contains(pizzaOrder)) {
        price = prices.get(pizzaOrder);
    }
    return price;
}

这样的设计更容易测试、更灵活、封装更好。

【讨论】:

  • 其实我认为这是大多数程序员所做的 - 编造一些东西并希望它会起作用:-D
  • 很公平。 8)编译器是一个例外 - 必须说语言。没有俚语;不要编造自己的方言。
【解决方案2】:

以下是三种基本方法:

1) 在if 语句中使用 OR:

if (pizza.equals("pizza1") || pizza.equals("pizza2") || ...)

2) 创建switch 语句:

switch(pizza) {
    case "pizza1":
    case "pizza2":
        return 10;
    case "pizza3":
        return 20;
    case "pizza4":
        return 15;        
}

3) 创建一个Map&lt;String, Integer&gt; 存储每个披萨的价格:

Map<String, Integer> prices = new HashMap<>();
prices.put("pizza1", 10);
prices.put("pizza2", 15);
prices.put("pizza3", 500); // Expensive pizza

int price = prices.get(pizza);

【讨论】:

    【解决方案3】:

    使用 switch case 语句(Java 7,并确保 pizza 不为空)。

    switch (Objects.requireNonNull(pizza, "pizza")) {
      "string1": 
      "string2":
      "string3":
        ...
      break;
      "string4": 
      "string5":
        ...
      break;
    }
    

    或者你可以使用:

    if (Arrays.asList("pizza1", "pizza2", "pizza3").contains(pizza)) {
      ...
    } else if (Arrays.asList("pizza3", "pizza4").contains(pizza)) {
      ...
    } 
    

    这取决于您的需要,并且 asList 可能会被重构为常量,使用不可变集合(例如 Collections.unmodifiableSet)。

    [edit] 既然有人使用枚举,你也可以这样做:

    enum Pizza {
      pizza1(10),
      pizza2(10),
      pizza3(0),
      pizza4(0);
    
      private final int additionalPrice;
      private Pizza(final int additionalPrice) {
        this.additionalPrice = additionalPrice;
      } 
      public int getAdditionalPrice() {return this.additionalPrice; }
    }
    

    稍后在您的代码中:

    String pizzaAsString = "pizza1"; // this is the variable "pizza" in your original code
    Pizza pizza = Pizza.valueOf(pizzaAsString);
    int price = 60 + pizza.getAdditionalPrice();
    

    枚举在某些情况下更好(这个)。

    【讨论】:

      【解决方案4】:

      switch-case 的扩展版本:

      int price = 60, price2 = 0;
      switch (pizza) {
        case "string3":
          price2 = 10;
          //intentionally no break.
        case "string1"://intentionally no break
        case "string2":
          System.out.println("You want " + pizza + " and it will cost " + (price + price2)  +" :-");
          break;
        default: throw new IllegalStateException("Wrong string for pizza: " + pizza);
      }
      

      虽然我可能会使用枚举而不是字符串。

      【讨论】:

        猜你喜欢
        • 2012-01-06
        • 1970-01-01
        • 1970-01-01
        • 2019-01-15
        • 2015-03-13
        • 2018-08-24
        • 2016-08-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多