我需要编写一个程序,该程序可以读取用户的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);
}
}
}
最佳答案
您最大的问题是如何处理循环。您将它们以错误的顺序嵌套。
您有一个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
变量),但是我希望这应该足以使您前进。关于java - JAVA车牌号,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33204828/