昨天参加了京东的笔试,因为输入数据的问题导致只有10%的数据ac,估计就gg了。痛定思痛,总结一下经验教训
首先,java的数据输入,自jdk1.5后,一般都采用Scanner类。
主要的api有next(),nextInt(),nextLine()等。
昨天的情景是需要输入一个小于20的数字n,之后输入两个n位数字(当时的理解就是数字,忽略了int长度的大小)。
由于我没考虑到长度的限制,用了nextInt接收输入,所以只通过了10%的测试例子。
之后采取输入一个字符串的思想,用了nextLine()函数,发现了一个问题
如图:
输入第一个数字n,之后回车,再输入第二个字符串时,程序中已经把a设为“”了,也就是空。
为什么会这样呢?
首先,nextInt方法接收了我输入的数字2,从输入流中去除,此时此行内容为空,我们再输入回车,nextLine方法将当前行的值赋给a,也就将空值赋给了a,而第二行的输入赋给了b。
如何解决这个bug呢?
查看了java中Scanner的api,我发现了next方法,api中是这么介绍的
Finds and returns the next complete token from this scanner. A complete token is preceded and followed by input that matches the delimiter pattern. This method may block while waiting for input to scan, even if a previous invocation of hasNext()
returned true
.
翻译一下,意思是说这个方法的作用是从Scanner中寻找返回一个完整的输入(也就是中间没有空格)。这个方法可能会阻塞正在等待的扫描,即使之前的hasNext方法返回值为真。
我们需要输入一个字符串,所以正好用这个函数,接收一个完整的输入,改完之后,就全部ac了。