【问题标题】:Else statement only if checked through entire array仅当检查整个数组时才使用 Else 语句
【发布时间】:2012-12-27 08:20:40
【问题描述】:

我希望我的程序只打印一次“else 语句”,只有在 for 循环已经搜索过我的“orderProduct”数组长度之后。

我目前拥有的:

do
{
    System.out.print("Enter Order: "); 
    userOrder = in.next();

    for(int i=0; i<orderProduct.length; i++)
    {
        if(userOrder.equals(orderProduct[i].code))
        {
            System.out.print("Enter Amount: ");
            userQuantity = in.nextInt();
            break;
        }
        else
        {
            System.out.println("Sorry, invalid order.");
        }
    }
}
while(!userOrder.equals("0"));

此代码总是在检查数组的第一个元素后执行“else 语句”。有没有办法只有在for循环遍历整个数组时才打印它?

【问题讨论】:

  • 您需要从循环中删除它,并且您可能需要使用一些标志变量作为条件,以便您可以在循环外进行测试。

标签: java loops if-statement


【解决方案1】:

您可以在 if 循环中设置一个标志,并在整个 for 循环之后检查 是否保持未设置

Boolean valid = false;
for(int i=0; i<orderProduct.length; i++)
{
    if(userOrder.equals(orderProduct[i].code))
    {
        System.out.print("Enter Amount: ");
        userQuantity = in.nextInt();
        valid = true;
        break;
    }

}
if(!valid){
        System.out.println("Sorry, invalid order.");
}

【讨论】:

  • 您还应该在if 条件中添加一个中断,以避免迭代到最后。
  • 您的代码是说,如果订单中至少有一个产品代码有效,那么整个订单都是有效的。我不确定这是否是作者想要实现的目标。
  • @VladSpreys.. 不,这不是 OP 想要实现的。他正在对照存储在数组中的所有订单检查订单号。如果在数组中找到,则进行处理。
  • 我已经添加了break,这是我对目的的误解,但它并没有真正改变任何东西,除了非常小的速度增益,假设每个产品的代码都是唯一的。
  • @VladSpreys OP 正在列表中搜索匹配的一个产品代码,所以我相信我的代码可以实现这一目标。
【解决方案2】:

else 中使用break branching statement,而不是在if 中。或者将循环更改为while,并在您的else 块中具有当前的停止条件。

【讨论】:

    【解决方案3】:

    试试这个:

    boolean invalidOrder = false;
    do
    {
        System.out.print("Enter Order: "); 
        userOrder = in.next();
    
        for(int i=0; i<orderProduct.length; i++)
        {
            if(userOrder.equals(orderProduct[i].code))
            {
                System.out.print("Enter Amount: ");
                userQuantity = in.nextInt();
            }
            else
            {
                invalidOrder = true;
            }
        }
    }
    while(!userOrder.equals("0"));
    
    if(invalidOrder)
        System.out.println("Sorry, invalid order.");
    

    【讨论】:

    • 你知道这会得到同样的结果,就像他说的他总是会去 else 树吗?
    • 但是即使它是一个有效的订单,并且用户输入了一个 0。即使这样,当用户离开整个订单循环时,它也只会打印无效的订单
    • 我相信 OP 正在列表中搜索一个匹配的代码。这意味着它将在 N-1 次迭代中为“invalidOrder”,如果没有中断,即使代码较早找到,最后一次迭代也很有可能无效。
    【解决方案4】:

    尝试设置一个条件来打印整个内容

    do
    {
    System.out.print("Enter Order: "); 
    userOrder = in.next();
    
    boolean found = false;
    
    for(int i=0; i<orderProduct.length; i++)
    {
        if(userOrder.equals(orderProduct[i].code))
        {
            System.out.print("Enter Amount: ");
            userQuantity = in.nextInt();
            found = true;
            break;
        }
    }
    if(!found)
        System.out.println("Sorry, invalid order.");
    }
    while(!userOrder.equals("0"));
    

    【讨论】:

      【解决方案5】:

      除了使用标志之外,您还可以使用标签。

      FOUND: {
        for(OrderProduct op: orderProduct) {
          if(userOrder.equals(op.code)) {
              System.out.print("Enter Amount: ");
              userQuantity = in.nextInt();
              break FOUND;
          }
        }
        System.out.println("Sorry, invalid order.");
      }
      

      或者您可以将循环移动到方法中并使用 return 而不是 break。

      然而看起来你真正想要的是一张地图。

      // use a map instead of a collection or an array.
      Map<String, OrderProduct> map = new LinkedHashMap<>();
      for(OrderProduct op: orderProduct) map.put(op.code, op);
      
      OrderProduct op = null;
      while(op == null) {
        System.out.print("Enter Order: "); 
        String userOrder = in.next();
        OrderProduct op = map.get(userOrder);
        if (op == null) {
          System.out.println("Sorry, invalid order.");
        } else {
          System.out.print("Enter Amount: ");
          userQuantity = in.nextInt();
        }
      }
      

      【讨论】:

        【解决方案6】:

        你可以尝试这样的事情我知道问题不是关于地图,但你也可以对数组做同样的事情。

        public class TestClass {
        
            public static void main(String[] args) {
                Map<String, String> cookieMap = new HashMap<String, String>();
                Set<Map.Entry<String, String>> cookieSet = null;
        
                cookieMap.put("A", "1");
                cookieMap.put("B", "2");
                cookieMap.put("C", "3");
                cookieMap.put("D", "4");
                cookieMap.put("E", "5");
        
                cookieSet = cookieMap.entrySet();
                Boolean valid = false;
                  for (Map.Entry<String, String> cookieKeyValue : cookieSet) {
                      if(cookieKeyValue.getKey().contains("H")){
                          System.out.println(cookieKeyValue.getValue());
                          System.out.println("True");
                          valid = true;
                          break;
                      }
                  } if (!valid) {
                      System.out.println("False");
                  }
             }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-11-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多