Java - 如果无法读取布尔值,如何停止或继续DO WHILE循环

时间:2017-04-15 21:22:11

标签: java boolean

我想要实现的是:用户应输入一串日期。然后,我将获取每个日期并验证它并将其添加到ArrayList。 如果日期与正则表达式不匹配,则应重新启动do while循环并再次请求输入。

我正在验证方法中的几个输入,并且所有这些输入都使用布尔值" inputNotApproved"判断是否应该结束。它通过更简单的验证工作得很好,例如名称,但因为我必须在do while循环中运行一个额外的while循环,程序无法读取布尔值" inputNotApproved"。

如果某些日期与正则表达式不匹配,如何告诉do while循环重启。

do {
ArrayList<String> inputDatesList = new ArrayList<String>(); 
System.out.print("Available booking dates (DD-MM-YYYY DD-MM-YYYY ...): ");

       while(input.hasNext()){
            String date = input.next();

            if(date.matches("(0?[1-9]|[12][0-9]|3[01])-(0?[1-9]|1[012])-((20)(17|18))")){
                inputDatesList.add(date);
                inputNotApproved = false;
            }
            else{
                inputNotApproved = true;
                System.out.println("The date format is not correct (DD-MM-YYYY).");
            }
        }
}
while(inputNotApproved);

我使用它并且inputNotApproved按预期工作的示例:

do {
            System.out.print("Email address: ");
            String inputEmail = input.nextLine();

            if(inputEmail.matches("^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$")){
                inputNotApproved = false;
                newDentist.setEmail(inputEmail);
            }
            else {
                System.out.println("ERROR! The email is not in the correct format.");
                inputNotApproved = true;
                }
}

    while(inputNotApproved);

非常感谢任何帮助。如何让循环监听&#34; inputNotApproved&#34;的真/假。谢谢。

我也尝试了以下内容,它对布尔值设置为false,但是do-while不会继续。

do {
            ArrayList<String> inputDatesList = new ArrayList<String>();
            System.out.print("Available booking dates (DD-MM-YYYY): ");
            inputNotApproved = true;

            while(input.hasNext() && input.hasNext("(0?[1-9]|[12][0-9]|3[01])-(0?[1-9]|1[012])-((20)(17|18))")){
                String date = input.next();
                inputDatesList.add(date);
                inputNotApproved = false;
            }


            if (!input.hasNext("(0?[1-9]|[12][0-9]|3[01])-(0?[1-9]|1[012])-((20)(17|18))")){
                System.out.println("The date format is not correct (DD-MM-YYYY).");
                continue;
            }
while(inputNotApproved);

最新更新。

我在内部while循环中添加了一个break和!inputNotApproved。但现在我注意到,当日期输入正确并且与正则表达式匹配时,循环不会结束。它只是继续接受输入。

我的代码现在看起来像这样:

do {
            ArrayList<String> inputDatesList = new ArrayList<String>(); // Temporary ArrayList, will be sent to ArrayList in Dentist class
            System.out.print("Available booking dates (DD-MM-YYYY): ");

        while(input.hasNext() && !inputNotApproved){
            String date = input.next();

            if(date.matches("(0?[1-9]|[12][0-9]|3[01])-(0?[1-9]|1[012])-((20)(17|18))")){
                inputDatesList.add(date);
                inputNotApproved = false;
            }
            else{
                inputNotApproved = true;
                System.out.println("The date format is not correct (DD-MM-YYYY).");
                break;
            }
        }
}
    while(inputNotApproved);

3 个答案:

答案 0 :(得分:1)

我认为这取决于您的具体要求 - 例如,如果日期无效,您是希望用户重新输入所有日期,还是仅仅重新输入无效日期?

作为首发,我认为符合您的要求,您可以在内部while循环中添加一个额外条件,使其类似于:

 package org.htech.leonardo.controllers;

 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;

 @Controller
 public class HomeController {

     @RequestMapping("/login")
     public void login() {
          System.out.print("HAHAHAH");
     }
 }

这个逻辑感觉有点混乱,所以你可能最好将内部while循环提取到一个单独的方法中,如果它们都被正确格式化,可以返回日期列表,如果格式不正确则抛出异常。在while (input.hasNext() && !inputNotApproved) 循环中,您只需捕获异常,并设置变量以触发它再次请求输入。

答案 1 :(得分:1)

如果我有更多的声誉,我会评论你正在循环中初始化你的ArrayList,这意味着它是一个局部变量。每次你的程序遍历循环时,它会重新创建你的ArrayList,这意味着你的方法什么都不做!我建议在循环外部初始化它,这样它实际上是有用的。

另外,您只需在while循环中更改inputNotApproved的值。你确定你的程序总是输入它吗?如果没有,你应该像在工作示例中那样在内部while循环之外将其设置为true。

您正在while循环中设置inputNotApproved,但是当您的程序完成此while循环时,它只会重新启动外部do循环!您可以在inputNotApproved = true之后使用break语句退出while循环并重新启动do循环。另一种方法是在while循环中添加一个检查,如下所示:

while(input.hasNext() && !inputNotApproved)

我将此代码放入调试器中,看起来很好。当输入正确时,我的程序不应该循环。但是,当程序看到错误的输入时,它会继续循环,因为在您发布的版本中,您不需要输入。

import java.util.*;
public class test {
    public static void main(String[] args) {
      Scanner input = new Scanner("12-12-2017 11-04-2017 12-12-2017 11-04-2017 12-12-2017 11-04-2017");
      Boolean inputNotApproved = false;
      do {
            ArrayList<String> inputDatesList = new ArrayList<String>(); // Temporary ArrayList, will be sent to ArrayList in Dentist class
            System.out.print("Available booking dates (DD-MM-YYYY): ");

        while(input.hasNext() && !inputNotApproved){
             String date = input.next();

            if(date.matches("(0?[1-9]|[12][0-9]|3[01])-(0?[1-9]|1[012])-((20)(17|18))")){
                inputDatesList.add(date);
                inputNotApproved = false;
                System.out.println(date);
            }
            else{
                inputNotApproved = true;
                System.out.println("The date format is not correct (DD-MM-YYYY).");
                break;
            }
        }
      }
      while(inputNotApproved);
   }
}

答案 2 :(得分:-1)

如果我正确理解你的问题,改变你的其他以包含一个中断可能会解决它,退出内循环,并触发第二个条件。

import numpy as np


dim = 5
mat = np.array([[2.802, 4.713, 9.581, 15.339, 22.273],
     [np.nan, 7.647, 5.559, 7.317, 10.250],
     [np.nan, np.nan, 5.383, 0.184, -0.882],
     [np.nan, np.nan, np.nan, -3.992, -11.124],
     [np.nan, np.nan, np.nan, np.nan, -20.192]])
mat_to_vect =  np.reshape(mat, (dim**2))
min_vect = [mat_to_vect[0]]

i = 1
j = dim

while i and j < dim**2-1:

    if mat_to_vect[i] > mat_to_vect[j]:
        min_vect.append(mat_to_vect[j])
        j += dim
        i += dim

    elif mat_to_vect[i] < mat_to_vect[j]:
        min_vect.append(mat_to_vect[i])
        j += 1
        i += 1

    elif m.isnan(mat_to_vect[i]):
        min_vect.append(mat_to_vect[j])
        j += dim
        i += dim

    elif m.isnan(mat_to_vect[j]):
        min_vect.append(mat_to_vect[i])
        j += 1
        i += 1

min_vect.append(mat_to_vect[dim**2-1])

修改 如果你想要它更简单,你可以尝试这样的东西。

        else{
                inputNotApproved = true;
                System.out.println("The date format is not correct (DD-MM-YYYY).");
                break;
            }