JAVA车牌号码

时间:2015-10-19 00:25:14

标签: java regex

我需要编写一个程序,从用户那里读取3个字母和3个数字并将它们插入到一个数组中(格式为:ABC-123)。

如何制作一个循环,要求用户输入5 * 3个字母和5 * 3个数字,直到他正确回答(“请输入3个字母”后只有3个字母,“请输入3个数字后”只有3个数字) ?

到目前为止我的代码:

    package bmm;

    import java.util.*;
    import java.util.regex.Pattern;
    public class bmm {

        public static void main(String[] args) {
            Scanner scr = new Scanner(System.in);
            String[] letter = new String[5];
            int[] number = new int[5];
            int db = 0;
            do {
                for (int i = 0; i < letter.length; i++) {

                    System.out.println("3 letters please:");
                    letter[i] = scr.nextLine();
                    if (Pattern.matches("[a-zA-Z]+", letter[i]) == false || letter[i].length() != 3) {
                        System.out.println("not letters or too short/long");
                    } else {
                        db++;
                    }
                }
            } while (letter[db].length() != 3 && Pattern.matches("[a-zA-Z]+", letter[db]) != true);
        }
    }
}

2 个答案:

答案 0 :(得分:1)

你最大的问题是你如何处理循环;你让它们以错误的顺序嵌套。

你有一个do循环应该循环,直到输入字符串符合要求。 那个循环中,你有一个for循环遍历数组(我假设用户应该输入5个有效的许可证号码?)。由于从0到4的循环在内部,程序在检查do结束条件之前遍历整个数组。那不是你想要的。您想首先输入letter[0],然后继续输入,直到用户输入letter[0]的有效输入。然后继续输入letter[1],循环直到输入有效,依此类推。我认为那是你想做的,对吧?要以这种方式执行操作,执行检查的循环必须位于for循环内。此外,您已经定义了两个应该指示数组索引的变量idb,并且您的程序似乎对它使用的是哪一个感到困惑。你不需要两者。

这里的内部循环应该是什么样的,大约:

do {
    System.out.println("3 letters please:");
    letter[i] = scr.nextLine();
    if (Pattern.matches("[a-zA-Z]+", letter[i]) == false || letter[i].length() != 3) {
        System.out.println("not letters or too short/long");
    } 
} while (letter[i].length() != 3 && Pattern.matches("[a-zA-Z]+", letter[i]) != true);

除了&&这里错了。您上面使用了||;为什么他们会有所不同?事实上,你不应该两次重复这个条件。您可以将匹配结果保存在boolean变量中:

boolean invalid;
do {
    System.out.println("3 letters please:");
    letter[i] = scr.nextLine();
    invalid = (Pattern.matches("[a-zA-Z]+", letter[i]) == false || letter[i].length() != 3);
    if (invalid) {
        System.out.println("not letters or too short/long");
    } 
} while (invalid);

现在,当您输入两次表达式时,您不必担心会出错。

我不会完全像这样编写代码(你永远不需要说== false== true作为布尔表达式,而我使用break来代替一个boolean变量),但我希望这足以让你前进。

答案 1 :(得分:0)

不清楚你在做什么或做什么。如果您给用户5个机会输入一个车牌号码,则无需将它们存储在数组字母[]中,除非您想要保留错误的答案。 db和我似乎在做什么相互冲突。你也没有匹配任何数字。您可能希望将循环分开以使事情更清晰。以下是在方法中获取单个板号的示例:

public static String getPlate(){
    Scanner scr = new Scanner(System.in);

    int tries = 0;
    boolean validResponse = false;

    while (tries<5 || validResponse){
        String response = scr.nextLine();
        if (Pattern.matches("[a-zA-Z]+", response) == false || response.length() != 3) {
            validResponse = false;
        } else {
            return response;
        }
        tries++;
    }
    return null;
}

然后当你需要一个盘子时,你可以称之为:

String plate = getPlate();

并根据需要填充数组。