2015-10-19 53 views
1

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

我怎样才能让一个循环,要求用户输入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); 
     } 
    } 
} 

回答

1

你最大的问题是你如何处理回路;你有他们嵌套在错误的顺序

你有do循环,应该。循环直到输入字符串与req匹配uirements。 这个循环中,你有一个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可变的),但我希望这应该是足以让你去。

+0

非常感谢您的回答!你解决了我的问题,并帮助我理解了这个dowhile循环。我是一个新手,对于这个迟钝的问题感到抱歉。无论如何,你离开我挂了:)如果不是这样,你会如何解决这个问题? –

+0

我不确定有什么重大的改变。你可以说'!Pattern.matches(“[a-zA-Z] +”,letter [i])'而不是'Pattern.matches(“[a-zA-Z] +”,letter [i])= =假'。你可以摆脱布尔型,使用'while(true){...}'作为循环,并说'if(!Pattern.matches(...)|| letter [i] .length()! = 3){System.out.println(...); } else {break; }'这将在输入有效时立即离开循环。 – ajb

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(); 

,并根据需要填写您的阵列。