今天做笔试,ACM模式,因为很久没有做acm模式了(一直在leetcode上做核心代码模式),所以导致输入不太会写,结果可想而知,关键题目都挺简单。
Scanner库 (java.util.Scanner)
Scanner主要用来做java的键盘输入和显示器的输出
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 主要方法
String str1 = sc.next(); // 返回下一个字符串,到空格或回车结束
String str2 = sc.nextLine(); // 返回下一行字符串(包括空格),到回车结束
int a1 = sc.nextInt(); // 返回下一个int数字
long l1 = sc.nextLong(); // 返回下一个long数字
// hasXXX方法,只会返回true或阻塞,不会返回false,与以上方法对应
sc.hasNext(); // 是否有下一个字符串
sc.hasNextLine(); // 是否有下一行
sc.hasNextInt(); // 是否有下一个int数字
sc.hasNextLong(); // 是否有下一个long数字
}
}
一些需要注意的问题
hasNextLine()和 nextXXX()的组合使用
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 注意这段代码在本地不会结束,因为while循环内不会返回false,
// 而在线平台因为使用了重定向(将调试代码放入文件中)所以可以跳出
while(sc.hasNextLine) {
int n = sc.nextInt();
int sum = 0;
for(int i = 0; i < n; i++) {
sum += sc.nextInt();
}
System.out.println(sum);
}
}
}
以上循环在牛客的acm模式下会报错,如果把while循环中的hasNextLine改为hasNextInt()就不会报错了。所以尽量少使用hasNextLine(),必须使用时搭配nextLine()来拿数据。
这里我的理解是hasNextLine()通过/n来进行判断,而最后一行会自动添加一个/n,这样在最后一行进行while判断时会多出一次循环,而这个循环会导致拿不到String,Integer等数据,所以会报数组越界
nextLine()会跳过一个/n,然后去拿来一行数据,到下一个/n之前截止
nextInt()等方法因为是要拿数字,在判断时会自动跳过 /n,但是当拿完数据时光标不变,所以之后还有一个/n
重定向
上面提到了使用重定向可以跳出while循环,因为是通过文件来引入测试数据,这样文件读取完毕就可以结束程序运行
// 重定向从文件读入测试数据,可以跳出hasNext()的while循环
FileInputStream fis=new FileInputStream("test.txt");
System.setIn(fis);
Scanner sc = new Scanner(System.in);
while(sc.hasNextLine()) {
System.out.println(sc.nextLine());
}