如何使用 Scanner.hasNextInt() 检查接下来的 3 个输入是否是 int,并且仅在 java 中循环



如何检查用户给出的下一个三个输入是否是一个整数值, 比如说有三个变量,

  • var1
  • var2
  • var3

我把输入当作,

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

现在,如果我想使用while(sc.hasNextInt())来确定下一个输入是否是 int,那么它只会检查 var1 的下一个输入是否为 int,而不会检查变量var2var3的另一个输入。通过将while loopif (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.hasNextIntScanner.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!");

我希望这对你有所帮助。

最新更新