问题描述
今天在写算法题时遇到一个问题,首先我调用了nextInt方法读取一个整数,随之又调用了nextLine方法读取一行,发现nextLine方法读取的值为空,代码如下:
此处nextInt方法在“一”处调用,nextLine方法在“二”处调用
public static void main(String[] args){
Scanner in=new Scanner(System.in);
Stack<Integer> stack=new Stack<>();
int n=in.nextInt(); //一
String[] elems=in.nextLine().split(" ");//二
for(int i=0;i<n;i++)
{
stack.add(Integer.parseInt(elems[i]));
}
Stack<Integer> help=new Stack<>();
while(!stack.isEmpty()){
int cur=stack.pop();
while(!help.isEmpty()&&help.peek()>cur){
stack.add(help.pop());
}
help.add(cur);
}
while(!help.isEmpty()){
System.out.print(help.pop()+" ");
}
}
代码逻辑是没有问题,简单调试了一下,发现“二”处的elems读取值为空
问题原因
在网上查找了相关资料才了解到,nextInt方法调用时,根据当时输入的数据,Enter作为它的结束符,并且该方法不会将Enter这个结束符从缓存中清除,当之后调用nextLine方法时,nextLine方法以Enter作为结束标志,不会再读取其他数据了。
具体描述如下:
next()与nextLine()的区别 :
- next()方法在读取内容时,会过滤掉有效字符前面的无效字符,对输入有效字符之前遇到的空格键、Tab键或Enter键等结束符,next()方法会自动将其过滤掉;只有在读取到有效字符之后,next()方法才将其后的空格键、Tab键或Enter键等视为结束符;所以next()方法不能得到带空格的字符串。
- nextLine()方法字面上有扫描一整行的意思,它的结束符只能是Enter键,即nextLine()方法返回的是Enter键之前没有被读取的所有字符,它是可以得到带空格的字符串的。
- next()方法在扫描到空白符的时候会将前面的数据读取走,但会丢下空白符“\r”在缓冲区中
- nextLine()方法在扫描的时候会将扫描到的空白符一同清理掉
解决方法
其实也好解决,在每一个 next()、nextDouble() 、nextFloat()、nextInt() 等语句之后加一个nextLine()语句,将被next()去掉的Enter结束符过滤掉。
即:
//...
int n=in.nextInt(); //一
nextLine();
String[] elems=in.nextLine().split(" ");//二
//...