Java Scanner工作机制疑问:对一段输入统计代码的输入逻辑困惑
关于Java Scanner工作机制的疑问
我的代码与疑惑
public class Solution { public static void main(String[] args) { Scanner in = new Scanner(System.in); int N = in.nextInt(); int count = 0; for (int i = 0; i < N; i++){ if (in.nextInt() % 7 == 0){ count++; } } System.out.printf("%d", count); } }
我原本以为这段代码只会从键盘接收1个输入,但实际上它将第一个数字作为输入数量,之后还会接收N个数字。想请教Scanner的具体工作机制是怎样的?
解答
别担心,这个误解挺常见的,咱们一步步拆解Scanner的工作逻辑:
Scanner是绑定输入流的"扫描器"
当你写Scanner in = new Scanner(System.in);时,你创建了一个和**标准输入流(键盘输入)**绑定的Scanner实例。它不会只盯着"一次输入",而是把你从键盘输入的所有内容(不管你分几次敲回车、用空格分隔)当成一个连续的、由空白(空格、回车、制表符等)分隔的元素序列。nextInt()是"取走下一个整数"
每次调用in.nextInt(),Scanner都会做这几件事:- 跳过输入流里所有的空白字符(不管是换行还是空格)
- 找到第一个符合整数格式的字符序列,把它转换成
int类型返回 - 然后把指针移到这个整数的后面,等着下一次读取
所以你的代码里:
- 第一次
nextInt()读取的是第一个整数,赋值给N,这时候输入流里剩下的内容还在,没被处理 - 循环里的
N次nextInt(),每次都会从输入流里取下一个整数,不管这个整数是和N在同一行,还是在后面的行里
举个实际输入的例子
比如你在键盘输入:4 7 14 21 22或者直接输入
4 7 14 21 22然后回车,Scanner的处理逻辑是完全一样的:- 第一次
nextInt()拿到4(赋值给N) - 循环4次,依次拿到
7、14、21、22,统计其中能被7整除的数量(这里是3)
- 第一次
简单来说,Scanner不是按"行"或者"单次输入"来读取的,而是按分隔符(默认是空白)分割的元素来逐个读取,每次调用nextXxx()方法就取走下一个对应类型的元素。
内容的提问来源于stack exchange,提问作者user9525103
相关产品推荐
相关产品推荐

