1. 易错IO知识点

1.1. next(),nextInt()与nextLine()的区别

先看一个输入输出实验:

原因:1

  1. next()nextInt()都是空格就读取完毕,它们不同在于一个返回String,一个只识别数字(否则报InputMismatchException);
  2. 第一条中它们读取完之后cursor(光标)指向本行中元素读取后的下一位;
  3. nextLine()会读入空格,一直到\n才读取完毕;
  4. 故它们一起使用时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(1n10000),紧接着有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(1n10000)个整数,一行一个数字

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;
        }

3. 业务IO场景

3.1. 读入json

3.2. 输出json

3.3. 由json对象信息返回url参数

Footnotes

  1. Java中关于nextInt()、next()和nextLine()的理解