输入验证使用数组和for循环检查重复项和格式

时间:2011-11-11 22:41:36

标签: java validation input for-loop while-loop

希望有人可以提供帮助。我想,遗漏了一些明显的东西。我必须让用户输入一个帐号。我需要针对两项检查验证这一点。一个是它尚未使用,并且格式正确。 我玩过这个并尝试过不同的方法。我认为它失败的原因是因为通过数组的中途,我要求用户输入。

当用户输入数据时,它会停止for循环,然后从那里继续。我如何验证两者?

System.out.println("Please enter an ID (format PNOnnn)");
String pnoID = console.next();
boolean pnoIDValid = false;
while (pnoIDValid);
{
    for (int i = 0 ; i < pno.length ; i++)
    {
        if (pno[i] != null)
        {
            if (pnoID.compareToIgnoreCase(pno[i].getmID()) == 0)
            {
                System.out.println("ID already used");
                //pnoID = console.next();
            }
            else
            {
                if (!(pnoID.matches("PNO\\d{3}")))  
                {
                    System.out.println("Must be in format PNOnnn");
                    //pnoID = console.next();
                }
                else
                {
                    pnoIDValid = true;
                }
            }   
        }
    }
}

我想知道这是否导致数组未被检查。我也试过这种方式。从逻辑上讲,这对我来说很有意义,但它只是不起作用。

System.out.println("Please enter a ID (format PNOnnn)");
String pnoID = console.next();
boolean pnoIDValid = false;
while (pnoIDValid);
{
    for (int i = 0 ; i < pno.length ; i++)
    {
        if (pno[i] != null)
        {
            if ((pnoID.compareToIgnoreCase(pno[i].getmID()) == 0) || 
                      (!(pnoID.matches ("PNO\\d{3}"))))
            {
                System.out.println("ID already used");
                pnoID = console.next();
            }
            else
            {
                pnoIDValid = true;
            }
        }
    }
}

我最终选择了:

int subSelection = console.nextInt();
if(subSelection == 1){
    System.out.println("Enter ID"); 
    String pnoID = cons.next(); 
    int test1=0; int test2=0; 
    for (int i = 0 ; i < pno.length ; i++){
        if (pno[i]!=null && pnoID.compareTo(pno[i].getmID()) == 0)){
            test1 = 1;
        }else{
            test2 = 1;
        }
    }
    int test3 = 0; int test4 = 0;
    if (pnoID.matches("PNO\\d{3}")){
        test3 = 1;
    }else{
        test4 = 1;
    }
    if (test1 == 1 && test4 == 1){
        System.out.println("This ID  exists or format invalid");
    }else{
        System.out.println("enter name (first and last)");
        String name = cons.nextLine();
        System.out.println("enter phone number");
        String phone = cons.nextLine();
    }

然而奇怪的是,我第一次经历这个,我能够正确输入细节。但第二次它没有给我输入ID的选项。它显示问题“输入id”,但随后立即转到下一个问题“输入名称”。 我有两台扫描仪;一个用于菜单选择,一个用于用户输入。这可能导致冲突吗?

解决:

现在也已经解决了。从我在网上看到的;使用扫描仪时,新的行字符(回车/输入键行程)将保留在缓冲区中,并且会被拾取,这会导致跳过第二个控制台条目。

建议的解决方案是使用bufferedreader nextLine(),我尝试了所有字符串条目,这已成功解​​决了我的问题。

1 个答案:

答案 0 :(得分:1)

提取唯一性检查以分离方法:

private boolean isIDUnique(String pnoID) {
    for (int i = 0; i < pno.length; i++) {
        if (pno[i] != null && pnoID.compareToIgnoreCase(pnoID)) {
            return false;
        }
    }
    return true;
}

主要方法:

System.out.println("Please enter a ID (format PNOnnn)");
String pnoID;
boolean pnoIDValid = false;
do {
    pnoID = console.next();
    if (!isIDUnique(pnoID) {
        System.out.println("ID is not unique");
    } else if (!pnoID.matches("PNO\\d{3}") {
        System.out.println("Invalid format");
    } else {
        pnoIDValid = true;
    } 
} while(!pnoIDValid);