📚 众所周知,Java的Scanner是真的慢,要是放在算法上基本数据还没读完就TLE了,再加上今年参加的是Java的蓝桥杯竞赛,数据读写上可不能掉链子,于是乎,就有了这篇实现Java快速读写的文章。
介绍
在使用之前我先介绍下StreamTokenizer green类:
StreamTokenizer说快但是也并没有比Scanner快多少(反正没有scanf快是真的)
- 在使用时
StreamTokenizer会为每个数据解析为Token,他的nextToken方法用于读取下一个标记。
- 它的
nval字段用于获取具体的数据,返回类型是double所以要进行强转
- 每次使用
nval读入数据之前必须要调用nextToken
sval字段用于读取字符串
模板代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| import java.io.*;
public class QuickIO {
private static StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in))); private static PrintStream out = System.out;
public static void main(String[] args) throws IOException { String s = next(); out.println(s); out.flush(); out.close(); }
public static int nextInt() throws IOException { in.nextToken(); return (int) in.nval; }
public static String next() throws IOException { in.nextToken(); return in.sval; } }
|
举例
以洛谷中P1177快速排序题目为例子,使用快速读写和Arrays的sort方法就能轻松通过此题,但如果使用Scanner提供的方法会相对慢100ms-300ms左右,在OI中相差100ms可是不小的差距了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| import java.io.*; import java.util.Arrays;
public class P1177快速排序 {
static StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in))); static PrintStream out = System.out; static StringBuilder builder = new StringBuilder();
public static void main(String[] args) throws Exception { int N = nextInt(); int[] arr = new int[N + 100]; for (int i = 1; i <= N; i++) { arr[i] = nextInt(); } Arrays.sort(arr, 1, N + 1); for (int i = 1; i <= N; i++) { builder.append(arr[i]).append(" "); } out.println(builder.toString()); }
private static int nextInt() throws Exception { in.nextToken(); return (int) in.nval; }
private static String next() throws Exception { in.nextToken(); return in.sval; } }
|

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintStream; import java.io.StreamTokenizer; import java.util.Arrays; import java.util.Scanner;
public class P1177快速排序2 {
static StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in))); static PrintStream out = System.out; static StringBuilder builder = new StringBuilder();
public static void main(String[] args) throws Exception { Scanner scanner = new Scanner(System.in); int N = scanner.nextInt(); int[] arr = new int[N + 100]; for (int i = 1; i <= N; i++) { arr[i] = scanner.nextInt(); } Arrays.sort(arr, 1, N + 1); for (int i = 1; i <= N; i++) { System.out.print(arr[i] + " "); }
}
private static int nextInt() throws Exception { in.nextToken(); return (int) in.nval; }
private static String next() throws Exception { in.nextToken(); return in.sval; } }
|
