【问题标题】:I don't know how to use while loop to make sure that only correct name can jump out of while loop我不知道如何使用while循环来确保只有正确的名称才能跳出while循环
【发布时间】:2019-11-11 07:21:08
【问题描述】:

基本上我的程序要求用户输入一个新名称,程序将检查新名称是否符合所有要求。

是的,名称应该添加到数组中并打印在外部文件中。 如果不是,它应该要求用户输入一个新名称。

我的问题是,我不会如何使用 while 循环来确保只有名称才能跳出循环。

我也在 main 方法中签名我的问题

public static void main(String[] args)throws FileNotFoundException {
    readFile();
    listUserName();
    while() {          // my question is at here that I don't how to use while loop to make 
                          //sure that only the name which pass all the check..method can 
                          //jump out of the loop
inputNewName();
            checkduplicate();
            checklength();
            checkcase();
            checkstart();
            checknumber();
            checkspecial(); 
        }
        addNewName();
        listUserName();


    }
    public static void readFile()throws FileNotFoundException {
     //read file and reseve in array
        Scanner input = new Scanner(new File("users.txt"));
        int i=0;
        while(input.hasNext()) {
               String info=input.next();
               userName[i]=info;
               i++;
        }
    }
    public static void listUserName() {//print name
        for(int i=0;i<userName.length;i++) {
            System.out.println(userName[i]);
        }       
    }
    public static void inputNewName() {// prompt uder for a new name
        System.out.println("Create a new user:");
        Scanner console=new Scanner(System.in);
        newname=console.next();
    }
    public static void addNewName()throws FileNotFoundException {//add new name in array

       System.out.println("User: \""+newname+"\" added successfully!");
       System.out.println("List of usernames: ");

       String[] tempuser=new String[userName.length+1]; 
        for(int i=0;i<(userName.length+1);i++) {
            if(i<userName.length) {
                tempuser[i]=userName[i];

            }else if(i==userName.length) {
                tempuser[userName.length] =newname;
            }
            System.out.println(tempuser[i]);
            }
            userName=tempuser;
            PrintStream out=new PrintStream(new File("users.txt"));  
            for(int i=0;i<userName.length;i++) {
                out.println(userName[i]);
            }
 }   
    public static void checkduplicate() { //check duplicate

        for(int i=0;i<userName.length;i++) {    
            if(newname.equals(userName[i])) {
                System.out.println("Invalid Name.Name already in use.");    
               }else {
                   valid=true;
               }
        }
    }
    public static void checklength() {//check length
            if(newname.length()>7) {
                System.out.println("Invalid Name"+"\n"+"Name too long.");
                }
            if(newname.length()<4) {
                System.out.println("Invalid Name"+"\n"+"Name too short.");
                }
    }
    public static void checkcase() {//check case                            
            boolean upcase=false;
            boolean lowcase=false;
            for(int i=0;i<newname.length();i++) {

                    if((0+newname.charAt(i))>=65&&(0+newname.charAt(i)<=90)) {
                        upcase=true;
                    }else if((0+newname.charAt(i))>=97&&(0+newname.charAt(i))<=122) {
                        lowcase=true;
                    }
            }
            if(upcase==false||lowcase==false) {
                System.out.println("Usernames must have lower-case and upper-case");
            }
    }   
    public static void checkstart() {
        if(((0+newname.charAt(0))<65&&(0+newname.charAt(0)>99))||
                ((0+newname.charAt(0))<97&&(0+newname.charAt(0))>122)){

                System.out.println("Invalid name. Name must start with a letter");
            }       
    }
    public static void checknumber() {
        boolean check=false;
        for(int i=0;i<newname.length();i++) {
            if((0+newname.charAt(i))>=48&&(0+newname.charAt(i))<=57) {
                check=true;
            }
        }
        if(check!=true) {
            System.out.println("Username must have at least one number");
            }
    }
    public static void checkspecial() {
        boolean check=false;
            for(int i=0;i<newname.length();i++) {
                if((0+newname.charAt(i))==33||(0+newname.charAt(i))==35||(0+newname.charAt(i))==63) {
                    check=true;
                }
            }
            if(check!=true) {
                System.out.println("Username must have at least one special character.");   
            }
    }

}

【问题讨论】:

  • 对于具有真/假结论的启动方法应返回boolean - 在您的循环中检查此值并根据需要中断或继续

标签: java arrays while-loop


【解决方案1】:

优雅的解决方案是将您的方法设为布尔类型而不是 void 类型。然后,你可以做

boolean light;

do{
    light = true;
    if(!inputNewName()) light=false;
    if(!checkduplicate()) light=false;
    if(!checklength()) light = false;
    if(!checkcase()) light = false;
    if(!checkstart()) light = false;
    if(!checknumber()) light = false;
    if(!checkspecial()) light = false; 
}while(light==false);

请注意,我将每个方法放在不同的 if 语句中。这迫使代码到达每个方法。如果您真的不需要调用每个方法(如果只有一个方法失败),您可以将它们组合在一个 if 语句中,或者实际上是在 while 条件下。

while(!inputNewName() || !checkduplicate() || !checklength() || !checkcase() || !checkstart() || !checknumber() || !checkspecial()) {}

此外,如果您将布尔变量创建为类的成员,然后在需要时在每个 void 方法中将其设置为 false,您可以获得相同的结果 - 尽管我必须建议您不要这样做,即使它会从设计的角度来看,这是糟糕的代码。

说了这么多,老实说,我会做的是:

  • 根据它们在概念上的作用来区分这些方法。这里有输入字符串、检查重复项和检查格式的方法。我将创建一种方法,它包含称为“checkFormat()”的所有格式检查。

  • 然后,我会按照我所说的那样制作布尔类型的每个方法。

我的时间是:

boolean light;
do
{
    light = inputNewName();
    if(light) light = checkDuplicate(); //this D should be upper case to follow the camel-case convention.
    if(light) light = checkFormat();
} while (!light); 

更新:我刚刚意识到您的代码旨在使用我告诉您不要使用的技术。您可以随时使用一个名为“valid”的变量。 虽然我真的建议你不要这样做你可以继续:

do{
    //all your stuff
} while(!valid);

【讨论】:

    【解决方案2】:

    在您的情况下,您可能更愿意使用do ... while 循环(它与while 循环完全相同,除非您保证运行一次。基本上您希望在do { 和@ 之间运行代码987654324@,直到达到某个条件(如您的 while 中所定义)。

    因此,在您的实现中,您将在输入的 string 无效时运行 while 循环,它看起来类似于以下内容:

    public class WhileLoop {
    
      public WhileLoop() {}
    
      public void run() {
        String name;
        boolean isValid;
        do {
            isValid = Boolean.FALSE;  // We want to set this to FALSE on each run of the loop. 
            System.out.println("Create a new user:");
            Scanner console = new Scanner(System.in);
            name = console.next();
            isValid = isValid || checklength(name); // run the checkLength method and perform a logical OR on the result from the method
        } while (!isValid); // loop while isValid = FALSE (Not TRUE)
        System.out.println("Name: " + name);
      }
    
      public boolean checklength(String name) { //check length, return TRUE if valid, else FALSE.
        boolean isVaild = Boolean.TRUE; // Set the default return value to FALSE
        if(name.length() > 7) {
            System.out.println("Invalid Name" + System.lineSeparator() + "Name too long.");
            isVaild = Boolean.FALSE; // If not valid then set isVaild to FALSE
        }
        return isVaild;
      }
    
      public static void main (String ... args) {
        WhileLoop whileLoop = new WhileLoop();
        whileLoop.run();
      }
    }
    

    请注意,checkLength 方法返回一个boolean,并使用逻辑或将其结果应用于您的标志。

    现在,您只需添加各种检查,如下所示:

    isValid = isValid || checklength(name);
    isValid = isValid || checkCase(name);
    ...
    isValid = isValid || checkStart(name);
    

    哦,关于良好实践的一点点:

    • 打印换行符时,请使用System.lineSeparator() 而不是\n
    • 不要使用逻辑 OR (||),而是使用布尔函数,如下所示:

      isValid = checklength(name); isValid = Boolean.logicalOr(isValid, checkCase(name)); ... isValid = Boolean.logicalOr(isValid, checkStart(name));

    【讨论】:

    • @wenyi sun,这是否回答了您的问题。如果是这样,请标记它已解决但检查勾选。发送。
    猜你喜欢
    • 2021-10-19
    • 2013-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-26
    • 2019-05-10
    • 2021-08-31
    相关资源
    最近更新 更多