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()
方法会认为之后再没有非空字符,会返回一个falsehasNextLine()
方法会认为换行符\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]);
}
}
}