OJ在线编程常见输入输出练习,hasNext()和hasNextLine()方法的区别

参考

hasnext()和hasnextLine()、NextLine().split(“某字符”)

先总结

Scanner sr = new Scanner(System.in);

首先,sr.hasNext()与sr.next()配套使用;
sr.hasNextLine():与sr.nextLine()配套使用;
当然也可以不配套使用,但不配套使用,之间的转换比较麻烦;

  • sr.hasNext(): 是检测还有没有下一个输入;
  • sr.next():是指针移动到当前下标,并取出下一个输入,输入是一个String;
  • sr.hasNextLine():是检测下一行有没有输入;
  • sr.nextLine():把指针移动到下一行 ,然后取出当前这一行的输入,形式为String
  • split(""):split("")方法中的参数必须用双引号包住,分割后得到得是String[]。
  • sr.hasNext()与sr.next()配套:sr.hasNext()一次判断一个,sr.next()一次取一个,sr.hasNext()遇见\n,不认为这是一个输入。返回false,sr.next()自然取不到;
  • sr.hasNextLine():与sr.nextLine()配套:sr.hasNextLine()一次判断一行,sr.nextLine()一次取一行(这样,输入就不会取到\n,就避免了sr.hasNextLine()判断\n出错的情况),取出的每行是String,通常每行用split(“字符”)的方式分割得到一行中的各输入;这样sr.hasNextLine()遇不见\n,自然不会出错;
    • 若sr.hasNextLine():与sr.next()配套:sr.hasNextLine()一次判断一行,sr.next()一次取该行中一个,这样sr.hasNextLine()会遇见\n,导致sr.hasNextLine()判断出错;

具体解释

参考

在检查输入流时:

hasNext()方法会判断接下来是否有非空字符.如果有,则返回true,否则返回false;
hasNextLine() 方法会根据行匹配模式去判断接下来是否有一行(包括空行),如果有,则返回true,否则返回false;

比如当前我们有如下测试用例:

7 15 9 5

这个测试用例在牛客网上是以文件的形式进行存储的.
而在 linux 系统中文件的结尾会有一个换行符\n,也就是说从System.in输入流中真正读取到的数据流是这样的:

7 15 9 5 \n

程序在处理完5之后,输入流中就只剩下一个换行符\n了,在处理完5之后while再去进行循环判断,此时hasNext()方法和hasNextLine()方法去判断得到的结果就产生了差异;

  • hasNext()方法会认为之后再没有非空字符,会返回一个false
  • hasNextLine() 方法会认为换行符\n是一个空行,符合行的匹配模式,则会返回一个true,但实际上由于之后再没有数据了,所以会在读取输入流的时候发生异常,从而导致整个运行报错.
示例1
输入

1 2 3
4 5
0 0 0 0 0
输出
6
9
0

例子

OJ在线编程 第一题:A+B(1)
在这里插入图片描述

示例

输入
1 5
10 20
输出
6
30

实际的输入

1 5 \n
10 20 \n

  • sr.hasNext()与sr.next()配套:sr.hasNext()一次判断一个,sr.next()一次取一个,sr.hasNext()遇见\n,不认为这是一个输入。返回false,sr.next()自然取不到;
  • sr.hasNextLine():与sr.nextLine()配套:sr.hasNextLine()一次判断一行,sr.nextLine()一次取一行(这样,输入就不会取到\n,就避免了sr.hasNextLine()判断\n出错的情况),取出的每行是String,通常每行用split(“字符”)的方式分割得到一行中的各输入;这样sr.hasNextLine()遇不见\n,自然不会出错;
    • 若sr.hasNextLine():与sr.next()配套:sr.hasNextLine()一次判断一行,sr.next()一次取该行中一个,这样sr.hasNextLine()会遇见\n,导致sr.hasNextLine()判断出错;
  • sr.hasNext()与sr.next()版(最好)
    这里可以不用一次取一行,是因为,我知道一行输入的个数,且每行数据个数是一样的,否则还是sr.hasNextLine():与sr.nextLine()版好。
public class Main{
    public static void main(String[] args){
        Scanner sr = new Scanner(System.in);
        while(sr.hasNext()){
            int a = sr.nextInt();
            int b = sr.nextInt();
            System.out.println(a+b);
        }
    }
}
  • sr.hasNextLine():与sr.nextLine()版
import java.util.Scanner;

public class Main{
    public static void main(String[] args){
        Scanner sr = new Scanner(System.in);
        while(sr.hasNextLine()){
            String[] str= sr.nextLine().split(" ");
            int a = Integer.parseInt(str[0]);
            int b = Integer.parseInt(str[1]);
            System.out.println(a+b);
        }
    }
}
  • sr.hasNextLine():与sr.next()版(一般不这么写,这里主要是理解他们之间的区别)
    (1)
public class Main{
    public static void main(String[] args){
        Scanner sr = new Scanner(System.in);
        //=============================================
        //由于我们知道有两组数据,那当两组数据读完,我们手动退出即可,证明了sr.hasNextLine()会把\n当做新的一行输入
        int count = 0;
        //=============================================
        while(sr.hasNextLine()){
            int a = sr.nextInt();
            int b = sr.nextInt();
            System.out.println(a+b);
            //=============================================
            count++;
            if(count == 2) break;
            //=============================================
        }
    }
}

(2)

public class Main{
    public static void main(String[] args){
        Scanner sr = new Scanner(System.in);
        while(sr.hasNextLine()){
            int a = sr.nextInt();
            int b = sr.nextInt();
            System.out.println(a+b);
            //=====================================================
            //在判断还有没有下一行输入时,先用sr.hasNext()判断下面还有没有输入,因为sr.hasNext()不认为\n是输入,所以当没有下一行输入时,sr.hasNext()会返回fasle;
            //这样就避免了,sr.hasNextLine()在还没读到下一行数据前,先读取到\n,认为下一行还有数据;
            if(!sr.hasNext()) break;
        }
    }
}

练习

输入描述:
输入数据有多组, 每行表示一组输入数据。

每行不定有n个整数,空格隔开。(1 <= n <= 100)。

输出描述:
每组数据输出求和的结果

import java.util.Scanner;

public class Main{
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while(sc.hasNextLine()){
        //nextLine()一次读入一行,读入为String形式
            String[] str = sc.nextLine().split(" ");
            int sum = 0;
            for(String val : str){
                sum += Integer.parseInt(val);
            }
            System.out.println(sum);
        }
    }
}

print()和println()

  • print():输出的在同一行;
  • println():输出的占一行;

print()的例题:

输入描述:
输入有两行,第一行n

第二行是n个空格隔开的字符串

输出描述:
输出一行排序后的字符串,空格隔开,无结尾空格

示例1
输入
5
c d a bb e

输出
a bb c d e
import java.util.Scanner;
import java.util.Arrays;

public class Main{
    public static void main (String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        String[] list = new String[n];
        for (int i = 0; i<n; i++) {
            list[i] = sc.next();
        }
        Arrays.sort(list);
        for(int i = 0; i<n-1; i++){
        //注:是print,不是println,因为输出只有一行。
            System.out.print(list[i]+" ");
        }
        System.out.print(list[n-1]);
    } 
}

println()的例题:

输入描述:
多个测试用例,每个测试用例一行。

每行通过空格隔开,有n个字符,n<100

输出描述:
对于每组测试用例,输出一行排序过的字符串,每个字符串通过空格隔开

示例1
输入
a c bb
f dddd
nowcoder

输出
a bb c
dddd f
nowcoder
import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        while(in.hasNextLine()){
            String[] str = in.nextLine().split(" ");
            Arrays.sort(str);
            for(int i = 0 ; i < str.length - 1 ; i++){
            //注:是print,不是println,因为前面n-1个输出在同一行。
                System.out.print(str[i] + " ");
            }
            //注:是println,不是print,因为第n个输出是一行的结尾,且还有下一行,若不用println用print,则会导致下一行还是输出在该行。
            System.out.println(str[str.length - 1]);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值