在阿里笔试中拿了零分,竟是不知道这个?

       以前做算法题,都是实现一个方法,需要的参数会在方法参数中直接给出,而且需要的返回值直接在方法中 return 就好了。但是阿里的笔试,需要的参数居然要到输入流中读取,而且返回结果居然直接输出到控制台上。
如果没有见过这种套路的,当使用Java输入类nextLine方法读取输入流中的字符串时,总会莫名其妙地少读一部分!那在这里,让我们新华的专业讲师来给大家带来一场专业的分析。
 
       读取一个数字
       既然我们要读取输入,肯定得用到 Scanner 类,这个类倒是挺简单的,例如,我们需要读取一个数字,可以这样子设计程序。
 
package test;
 
import java.util.Scanner;
 
public class HelloWorld {
 
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int i = sc.nextInt();
System.out.println("读取到的数字是:" + i);
    }
}
 
       我们随意输入一个数字 100,控制台的输出也证明了我们的程序可以读取这个数字。
       好了,重点来了!读取数字倒没什么,读取字符串会要了老命!读取数据的时候如果一直尝试使用nextLine这个方法来读取字符串(如果我们不知道next这个方法时),nextLine读出来的数据总是缺斤少两!
       我们来还原一下现场,需求是这样的,需要我们读取一个数字,这个数字表示输入字符串的数量,然后下面跟着的就是一系列需要读入的字符串了,很多人在做这道题时想都没想,大笔一挥,写下如下代码:
 
package test;
 
import java.util.Scanner;
 
public class HelloWorld {
 
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int i = sc.nextInt();//读取的字符串数量
int index = 0;
String[] array = new String [i];//存放读取的字符串
while(index < i) {
array[index++] = sc.nextLine();
}
for (String str : array) {//输出读取的字符串
System.out.println("输入的字符串:" + str);
}
    }
}
 
       理想很美好,现实很骨感,写代码时光芒万丈,检查时却怨天尤人。这样的代码永远无法读取最后一行输入的字符串,这是为啥呢?
       因为nextLine可以接收空格或者tab键,其输入以enter键结束。
       程序在通过 nextInt 方法读取数字之后,会留下一个enter键,这个enter键会被第一个执行的nextLine函数接收,这导致我们能够读取的数据永远少一行(nextLine少执行一次),同时也能解释为什么字符串数组第一个元素为空。

       这个问题怎么解决呢?Java 输入类读取字符串的函数并非只有nextLine,通过next也能实现类似的功能,只不过next与nextLine不同,next不会接收回车符,tab或者空格键。在我们使用 nextLine时,需要注意前面是否有enter键,如果有,就会被nextLine吸收,从而造成bug!
       既然明白了nextLine与next的原理,解决问题就变得简单了,将读取字符串的函数由nextLine改为next便可,这样就不会吸收nextInt留下的enter键了。改进过的程序如下:
 
package test;
 
import java.util.Scanner;
 
public class HelloWorld {
 
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int i = sc.nextInt();//读取的字符串数量
int index = 0;
String[] array = new String [i];//存放读取的字符串
while(index < i) {
array[index++] = sc.next();
}
for (String str : array) {//输出读取的字符串
System.out.println("输入的字符串:" + str);
}
    }
}
 
       总结
       最后我们再来总结一下nextLine与next两个方法的区别:
       next不会接收回车符,tab或者空格键,在接收有效数据之前会忽略这些符号,若已经读取了有效数据,遇到这些符号会直接退出,而nextLine 可以接收空格或者tab键,其输入以 enter 键结束。
如果也想像一名资深程序员一样解决如此专业的问题,快到兰州新华互联网学校来学习吧!