1. 易错IO知识点
1.1. next(),nextInt()与nextLine()的区别
先看一个输入输出实验:
原因:1
next()
与nextInt()
都是空格就读取完毕,它们不同在于一个返回String,一个只识别数字(否则报InputMismatchException
);- 第一条中它们读取完之后
cursor
(光标)指向本行中元素读取后的下一位; - 而
nextLine()
会读入空格,一直到\n
才读取完毕; - 故它们一起使用时
nextLine()
会继续读取next()
或nextInt()
行中仍有的数据。
1.2. hasNext(),hasNextLine()与hasNextInt()的区别
hasNext()
在没有输入的时候等待输入(阻塞),在有输入的时候又因为没有使用它的重载函数hasNext(String pattern)
给于pattern
,所以会匹配任何输入而返回true
.hasNextLine()
目前还不知道怎么让它以为没有下一行…hasNextInt()
在有hasNext()
的基础上,还默认会判断是不是int
类型的数据,相当于自带判断是否是整数---^-?\\d+$
的pattern.
2. 经典IO场景
2.1. 输入知道有多少组
第一行是一个正整数T,表示有T组测试数据。
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int T = in.nextInt();
for(int i=0; i<T; i++) {
}
}
2.2. 一行输入的测试数据数量已知
每组数据第一个数为N(1⇐n⇐10000),紧接着有N个正整数(注意在一行)
int N = input.nextInt();
int[] a = new int[10000];
for (int j=0; j<N; j++) {
a[j] = input.nextInt();
}
2.3. 约定了结束标志,如”-1”
while (!input.hasNext("-1")) {
}
2.4. 没有约定结束标志
2.4.1. 读入一次输出一次
Scanner input = new Scanner(System.in);
Long mod = 1000000007l;
while (input.hasNext()) {
Long n = input.nextLong();
Long l = input.nextLong();
//带入function()方法,直接输出结果
System.out.println(function(n,l)%mod);
}
即在while中进行计算,在卡死前将所有结果输出。因为最后还需要hasNext()
的阻塞,所以不能替换成true
.
2.4.2. 利用空串作为结束标志-读取一行内的数据
Scanner input = new Scanner(System.in);
while (input.hasNextLine()) {
String line = input.nextLine();
if(line.equals(""))
break;
String[] s = line.split(" ");
int[] nums = new int[s.length];
for(int i = 0; i < s.length;i++){
int[] nums[i]=Integer.parseInt(s[i]);
}
function(nums);
}
2.4.3. 利用空串作为结束标志-一行一个
2.4.3.1. 输入不知道多少个—开最大的数组
最多输入n(1⇐n⇐10000)个整数,一行一个数字
int[] nums = new int[10000];
int index =0;
while (input.hasNextLine()) {
String line = input.nextLine();
if(line.equals(""))
break;
nums[index++]=Integer.parseInt(line);
}
2.4.3.2. 输入不知道多少个—使用List转数组
List<Integer> list = new ArrayList<>();
while (input.hasNextLine()) {
String line = input.nextLine();
if(line.equals(""))
break;
list.add(Integer.parseInt(line));
}
int[] nums = new int[list.size()];
int index=0;
for(int b : list){
nums[index++] = b;
}