背景
本人最近在做华为机试练习题时,由于其输入用例为多行数据,因此混用了Scanner的next*()、next()、nextLine()。在使用过程中,发现了混用的一些问题,特此记录并分享。
三者的区别
Scanner内部拥有一个缓冲区,并且存在一个指针p指向下一个将要读取的元素,每调用一次next()、next*()、nextLine(),指针p都将会向前移动特定的距离。
1. next()划分每个元素的标准是:空格、制表符、或者换行符。所有元素均有这三种情况分割开来,其所有返回的值均为String类型。对于如下输入:
10 23 42 44
12 20
调用第一次next(),将会返回String类型的“10”,第二次调用返回“23”,依次类推,不同行的内容会自动跳至下一行的开始元素,如:第四次调用next()时返回“44”,而第五次调用next(),会返回“12”,并不会因为换行而造成返回换行符的情况。
测试程序如下:
import java.util.Scanner;
public class Test {
public static void main(String[] args) throws Exception {
Scanner in = new Scanner(System.in);
while (in.hasNext()) {
for(int i = 0; i<6;i++)
System.out.println("第"+(i+1)+"个输入,值为: "+in.next());
}
}
}
控制台输入输出显示内容如下:
10 23 42 44
12 20
第1个输入,值为: 10
第2个输入,值为: 23
第3个输入,值为: 42
第4个输入,值为: 44
第5个输入,值为: 12
第6个输入,值为: 20
2. next*()与next()的区别在于,可以将下一个需要读取的元素直接转化为指定的类型(如果可以转化的话),其余特性均相同。对于如下数据:
10 23 hello
world 2.34
第一次调用nextDouble()会自动将整型10转化为值为10.0的double类型,第二次调用nextDouble()会自动将整型23转化为值为23.0的double类型,第三次调用nextDouble()会产生java.util.InputMismatchException
异常,因为无法将一个字符串转化为一个double类型。
测试程序如下:
import java.util.Scanner;
public class Test {
public static void main(String[] args) throws