java - 如何使用 Scanner.hasNextInt() 检查下一个 3 输入是否为 int 并仅在 java 中循环
问题描述
如何检查下一个用户输入的三个输入是否是一个 int 值,比如假设有三个变量,
- 变量1
- 变量2
- 变量3
我正在接受输入,
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
使用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.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]*")
每次最终都会只测试 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()
.
推荐阅读
- python - 如何使用 python 在终端/命令提示符下运行方法
- c# - 无法使用 HttpClient 获取 API 资源
- python - Python Kivy 遍历 Widget 树
- maven - GitLab CI 中的 Maven 项目构建不使用缓存进行后续构建
- python - TypeError:需要一个整数(获取类型 str)-错误
- django - 如何从数据库呈现页面模板?
- python - 使用 pub sub 持久消息和键值存储替代 redis?
- javascript - 传单标记更新
- msys2 - 将 KDevelop 与 MSYS2 集成
- python - 使用正确的 URL 使用 BS 进行 Python 网页抓取?