首页 > 解决方案 > 如何使用 Scanner.hasNextInt() 检查下一个 3 输入是否为 int 并仅在 java 中循环

问题描述

如何检查下一个用户输入的三个输入是否是一个 int 值,比如假设有三个变量,

我正在接受输入,

Scanner sc = new Scanner (System.in); var1 = sc.nextInt(); var2 = sc.nextInt(); var3 = sc.nextInt();

现在,如果我想用来while(sc.hasNextInt())确定下一个输入是否为 int,那么它将仅检查 var1 的下一个输入是否为 int,而不会检查其他变量var2var3while loop使用with可以完成一件事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 }

所以我的问题是 javaScanner.hasNextIntScanner.hasNext("regex").

我也尝试过sc.hasNext("[0-9]* [0-9]* [0-9]*"),但实际上并没有奏效。

先感谢您。

标签: javaregexjava.util.scanner

解决方案


hasNext(regex)仅测试单个令牌。问题是默认分隔符是一个或多个空格,因此number number number不能是单个标记(分隔符 - 空格 - 不能成为其中的一部分)。所以sc.hasNext("[0-9]* [0-9]* [0-9]*")每次最终都会只测试 single 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,请查看Regex for a valid 32-bit signed integer。您也可以nextLong改用,因为long范围更大,但仍然具有最大值。要接受任何整数,无论​​其长度如何,您都可以使用nextBigInteger().


推荐阅读