众所周知,Java Scanner类的读入的真的真的慢
在我们使用Scanner类进行读入数据时,数据一旦过万,他就会显得非常慢
而用StreamTokenizer类差不多好像是要比Scanner快个300ms左右
这个时间虽然感觉很短!! 但是在算法实现中300ms 已经是一个非常大的数字了,他极有可能让我们感受到什么叫 TLE TTTTTT
所以这里我建议我们用Java读入数据较为庞大时,我们可以使用StreamTokenizer类
下面介绍他的用法
(1)我们在使用他时,我们要导入io包,他时io包中的类
(2)在使用这个类时,函数要throws IOException
(3)StreamTokenizer re = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in))); 这是他的具体实现
StreamTokenizer 类中 有个方法是 nval 这个方法就是我们读取数据的方法,他默认是double类型的,所以我们在读入的时候要将他强制转换类型
下面来看实现
import java.io.*;
public class test {
public static void main(String args[]) throws IOException{
StreamTokenizer re = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
re.nextToken(); int n = (int)re.nval;
System.out.println(n);
}
}
大家可以看到这里 我用了一个 nextToken()方法,这个方法是我们每次读入数据之前必须要写的,也就是我们读入一个数据之前就要写一个这个方法才行
比如上面如果我还要读入一个 m 那我就要写
re.nextToken(); int m = (int)re.nval; 总而言之就是读一个写一次就对了
下面有人会问了 ,你这个只能读入整数,那我读字符串怎么读呢?
当我们读字符串的时候我们就不需要加StreamTokenizer类
我们可以直接写成 BufferedReader re = new BufferedReader(new InputStreamReader(System.in));
来看代码
import java.io.*;
public class test {
public static void main(String args[]) throws IOException{
// StreamTokenizer re = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
BufferedReader re = new BufferedReader(new InputStreamReader(System.in));
String x = re.readLine();
System.out.println(x);
}
}
这样我们就可以读取字符串了,当然如果我们使用这种方法读取字符串的话,我们就不需要 之前的nextToken方法了哦
下面又有人会说了,那我要数字跟字符串一起读的时候我怎么办呢?
下面来看代码
import java.io.*;
public class test {
public static void main(String args[]) throws IOException{
BufferedReader re = new BufferedReader(new InputStreamReader(System.in));
StreamTokenizer r = new StreamTokenizer(re);
r.nextToken(); int n = (int)r.nval;
String x = re.readLine();
System.out.println(n+" "+x);
// 输入
// 3
// afadfa
// 输出
// 3
}
}
大家注意 上面这种写法就会出现一个问题,我们想的是 读入一个整数,然后读入一个字符串,可是我们这里只读入了这个整数怎么办呢?
这个是因为我们读入整数的时候,把整数读走了,但是整数后面的回车并没有读走,我们如果直接使用readLine()来读的话 就会读不到下一行的字符串 所以这里我们应该在加一个readLine()来读掉那个回车
看代码
import java.io.*;
public class test {
public static void main(String args[]) throws IOException{
BufferedReader re = new BufferedReader(new InputStreamReader(System.in));
StreamTokenizer r = new StreamTokenizer(re);
r.nextToken(); int n = (int)r.nval;
re.readLine();
String x = re.readLine();
System.out.println(n+" "+x);
// 输入
// 3
// afadfa
// 输出
// 3 afadfa
}
}
这样我们就可以读整数,读字符串啦,数据大的时候还是推荐大家用这种方法读入数据
然后我们还要介绍一个快输出,这个输入也比System的那个输出要快哦,所以我们以后写数据大的程序时,可以这样写
import java.io.*;
public class test {
public static void main(String args[]) throws IOException{
BufferedReader re = new BufferedReader(new InputStreamReader(System.in));
StreamTokenizer r = new StreamTokenizer(re);
PrintWriter pr = new PrintWriter(new OutputStreamWriter(System.out));
r.nextToken(); int n = (int)r.nval;
re.readLine();
String x = re.readLine();
pr.println(n+" "+x);
pr.flush();
// 输入
// 3
// afadfa
// 输出
// 3 afadfa
}
}
使用PrintWriter输出时 记得最后加个flush(), ok 我们就学会快读快输出啦
有问题欢迎留言