【问题标题】:Nested For-each loop printing for every item in ArraylistArraylist 中每个项目的嵌套 For-each 循环打印
【发布时间】:2020-04-22 11:27:47
【问题描述】:

如何修改此代码,使其仅在首先遍历整个列表后才打印出无效消息。我目前的问题是每次没有匹配时它都会打印出这些消息。这不是我打算做的。

public void assignSchedule(Depot depotName) throws Exception {
        String client, driver;
        Boolean exit = false;

        do {
            System.out.printf("%-10s %-10s %10s %n", "Client", "Start Date", "End Date");
            depotName.listWorkSchedulue();
            System.out.print("Enter the client name for the schedule you wish to assign: ");
            client = DepotSystem.input.nextLine();

            for (WorkSchedule ws : depotName.getWorkSchedules())
            {
                if (client.equals(ws.getClient()))
                {
                    System.out.printf("%n%20s%n", "Drivers");
                    depotName.listDrivers();
                    System.out.print("Which Driver do you want to assign this to: ");
                    driver = DepotSystem.input.nextLine();

                    for (Driver drivers : depotName.getDrivers())
                    {
                        if (driver.equals(drivers.userName) && !drivers.assigned)
                        {
                            System.out.printf("%nThe work schedule for client %s is now assigned to %s%n ", client,
                                driver);
                            depotName.getDriver(driver).setSchedule(depotName.getWorkSchedule(client));
                            drivers.setAssigned(true);
                            exit = true;
                        } else if ((!driver.equals(drivers.userName) && drivers.assigned)) {
                            System.out.printf("%nEither not a valid driver or Driver is already assigned a Job.%n");
                        }
                    }
                } else if (!client.equals(ws.getClient())) {
                    System.out.printf("%nPlease enter a valid client.%n");
                }
            }
        } while (!exit);
    }

如果我输入了一个不正确的名字,这个的当前输出如下

Client     Start Date   End Date 
Gary       2020-04-25   2020-04-27
Bob        2020-05-05   2020-05-06
Enter the client name for the schedule you wish to assign: f

Please enter a valid client.

Please enter a valid client.

当我输入错误的名称时,我希望它是这样工作的。

Client     Start Date   End Date 
Gary       2020-04-25   2020-04-27
Bob        2020-05-05   2020-05-06
Enter the client name for the schedule you wish to assign: f

Please enter a valid client.

【问题讨论】:

  • David - 如果其中一个答案解决了您的问题,您可以通过将其标记为已接受来帮助社区。接受的答案有助于未来的访问者自信地使用该解决方案。查看meta.stackexchange.com/questions/5234/… 了解如何操作。

标签: java foreach


【解决方案1】:

在 for 循环的顶部,您可以执行以下操作来确定是否有任何工作计划包含输入的客户。您随后可以将 depotName.getWorkSchedules() 替换为 clientSchedules 并删除条件 if (client.equals(ws.getClient())),因为我们知道它们都是具有相同客户端的计划。

请注意,该问题不包含完整的 SSCCE,缺少许多编译所需的基本类,因此可能会出现意外的编译错误。

            List<WorkSchedule> clientSchedules = depotName.getWorkSchedules().stream()
                            .filter(schedule -> client.equals(schedule.getClient()))
                            .collect(Collectors.toList());

            if (clientSchedules.isEmpty()) {
                System.out.printf("%nPlease enter a valid client.%n");
                continue;
            }

【讨论】:

    【解决方案2】:

    消息Please enter a valid client 应该在for 循环之外打印。按如下方式进行:

    public void assignSchedule(Depot depotName) throws Exception {
        String client, driver;
        Boolean exit = false, validClient;
    
        do {
            System.out.printf("%-10s %-10s %10s %n", "Client", "Start Date", "End Date");
            depotName.listWorkSchedulue();
            System.out.print("Enter the client name for the schedule you wish to assign: ");
            client = DepotSystem.input.nextLine();
    
            for (WorkSchedule ws : depotName.getWorkSchedules()) {
                if (client.equals(ws.getClient())) {
                    validClient = true;
                    System.out.printf("%n%20s%n", "Drivers");
                    depotName.listDrivers();
                    System.out.print("Which Driver do you want to assign this to: ");
                    driver = DepotSystem.input.nextLine();
    
                    for (Driver drivers : depotName.getDrivers()) {
                        if (driver.equals(drivers.userName) && !drivers.assigned) {
                            System.out.printf("%nThe work schedule for client %s is now assigned to %s%n ", client,
                                    driver);
                            depotName.getDriver(driver).setSchedule(depotName.getWorkSchedule(client));
                            drivers.setAssigned(true);
                            exit = true;
                        } else if ((!driver.equals(drivers.userName) && drivers.assigned)) {
                            System.out.printf("%nEither not a valid driver or Driver is already assigned a Job.%n");
                        }
                    }
                } else {
                    validClient = false;
                }
            }
            if (!validClient) {
                System.out.printf("%nPlease enter a valid client.%n");
            }
        } while (!exit);
    }
    

    【讨论】:

      【解决方案3】:

      在循环外声明一个布尔值并将其设置为 else if 条件,并在 else if 中检查此布尔值,类似于

       else if (condition && !booleanVariable) {
                System.out.printf("%nPlease enter a valid client.%n");
                 booleanVariable = true;
                 }
      

      【讨论】:

      • 那么 printf 行应该不再在这里了。
      猜你喜欢
      • 2012-04-06
      • 2019-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-16
      • 2017-05-22
      • 2012-09-14
      相关资源
      最近更新 更多