我需要编写一个程序,从用户那里读取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);
}
}
}
答案 0 :(得分:1)
你最大的问题是你如何处理循环;你让它们以错误的顺序嵌套。
你有一个do
循环应该循环,直到输入字符串符合要求。 在那个循环中,你有一个for
循环遍历数组(我假设用户应该输入5个有效的许可证号码?)。由于从0到4的循环在内部,程序在检查do
结束条件之前遍历整个数组。那不是你想要的。您想首先输入letter[0]
,然后继续输入,直到用户输入letter[0]
的有效输入。然后继续输入letter[1]
,循环直到输入有效,依此类推。我认为那是你想做的,对吧?要以这种方式执行操作,执行检查的循环必须位于for
循环内。此外,您已经定义了两个应该指示数组索引的变量i
和db
,并且您的程序似乎对它使用的是哪一个感到困惑。你不需要两者。
这里的内部循环应该是什么样的,大约:
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();
并根据需要填充数组。