如何检查用户给出的下一个三个输入是否是一个整数值, 比如说有三个变量,
- var1
- var2
- var3
我把输入当作,
Scanner sc = new Scanner (System.in);
var1 = sc.nextInt();
var2 = sc.nextInt();
var3 = sc.nextInt();
现在,如果我想使用while(sc.hasNextInt())
来确定下一个输入是否是 int,那么它只会检查 var1 的下一个输入是否为 int,而不会检查变量var2、var3的另一个输入。通过将while loop
与if (condition)
一起使用可以完成一件事。例如
Scanner sc = new Scanner (System.in);
while (sc.hasNextInt()) {
var1 = sc.nextInt();
if (sc.hasNextInt()) {
var2 = sc.nextInt();
if (sc.hasNextInt()) {
var3 = sc.nextInt();
}
}
}
但这看起来很长,需要写很多东西。对于我在语言 C中看到的类似问题,有一种可以解决问题scanf()
方法。例如
while(scanf("%d %d %d", &var1, &var2 & var3) == 3) {
// Statements here
}
所以我的问题是Java的Scanner.hasNextInt
或Scanner.hasNext("regex")
中是否有任何此类功能可用。
我也尝试过sc.hasNext("[0-9]* [0-9]* [0-9]*")
但实际上没有奏效。
提前谢谢你。
hasNext(regex)
只测试单个令牌。问题是默认分隔符是一个或多个空格,因此number number number
不能是单个标记(分隔符 - 空格 - 不能是其中的一部分(。所以sc.hasNext("[0-9]* [0-9]* [0-9]*")
每次最终都会只测试一个number
。顺便说一句,在您的模式中,*
可能应该+
,因为每个数字应该至少有一个数字。
为了让空格成为令牌的一部分,我们需要将它们从分隔符模式中删除。换句话说,我们需要将分隔符模式替换为仅表示行分隔符的模式,例如R
(更多信息(。这样,如果用户将数据写入一行(仅在第三个数字之后使用 enter(,则该行将被视为单个令牌,可以通过正则表达式进行测试。
稍后您需要将分隔符设置回一个或多个空格 (s+
(,因为nextInt
也基于单个令牌工作,所以没有它,我们最终会尝试像"1 2 3"
一样解析字符串。
Scanner sc = new Scanner(System.in);
sc.useDelimiter("\R");
System.out.print("Write 3 numbers (sepate them with space): ");
while(!sc.hasNext("\d+ \d+ \d+")){
String line = sc.nextLine();//IMPORTANT! Consume incorrect values
System.out.println("This are not 3 numbers: "+line);
System.out.print("Try again: ");
}
//here we are sure that there are 3 numbers
sc.useDelimiter("\s+");//nextInt can't properly parse "num num num", we need to set whitespaces as delimiter
int var1 = sc.nextInt();
int var2 = sc.nextInt();
int var3 = sc.nextInt();
System.out.println("var1=" + var1);
System.out.println("var2=" + var2);
System.out.println("var3=" + var3);
此解决方案可能存在的问题是,d+
将允许用户提供任何长度的数字,这可能超出int
范围。如果您只想接受int
请查看正则表达式以获取有效的 32 位有符号整数。您也可以改用nextLong
,因为long
范围更大,但仍具有最大值。要接受任何整数,无论其长度如何,都可以使用nextBigInteger()
。
我尝试了nextLine
方法和Pattern
的用法。正则表达式与 3 个用空格分隔的数字匹配。所以我认为它可以是这样的;
Scanner scanner = new Scanner(System.in);
Pattern p = Pattern.compile("[0-9]+\s[0-9]+\s[0-9]+$");
while(!p.matcher(scanner.nextLine()).find()){
System.out.println("Please write a 3 numbers which is separete with space");
}
System.out.println("Yes i got 3 numbers!");
我希望这对你有所帮助。