TOC
前言:其实这篇文章早就应该记录了,因为一开始觉得这么笨的一个问题肯就我会不知道,但后来想想还是记录下来吧。说到控制台输入输出,肯定第一就想到当时上Java基础的时候老师讲过的Scanner,但殊不知Scanner的效率很低,因为我们平时测试的数据量小可能看不出速度慢来,但当碰到某些数据量大又对时间要求严格的题,同样的算法用Scanner输入就力不从心了。早期就碰到了一个这样的题,算法已经基本不能再优化,怎么提交都有一个点TLE,后来用了StreamTokenizer和PrintWriter对输入输出进行优化后,竟然就AC了。
先上大体结构:
StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
while (in.nextToken() != StreamTokenizer.TT_EOF) {
//输入数字用in.nval;这个地方注意in.nval输入的是double类型
//字符串用in.sval;
//每次输入之后要想下一次输入,必须in.nextToken;获取
// 最后输入完的时候都需要
}
下面是引用在学习时候看到的文章中的一段话:
- 类java.io.StreamTokenizer可以获取输入流并将其分析为Token(标记)。StreamTokenizer的nextToken方法将读取下一个标记
- 默认情况下,StreamTokenizer认为下列内容是Token:字母、数字、除C和C++注释符号以外的其他符号。如符号“/”不是Token,注释后的内容也不是,而“\”是Token。单引号和双引号以及其中的内容,只能算是一个Token。
- 要统计文件的字符数,不能简单地统计Token数,因为字符数不等于Token,按照Token的规定,引号中的内容就算是10页也算是一个Token。如果希望引号和引号中的内容都算作Token,应该通过StreamTokenizer的ordinaryChar()方法将单引号和双引号当做普通字符处理。
详细语法使用方法:
import java.io.*;
public class Test {
//此处勿忘抛出异常
public static void main(String[] args) throws IOException {
StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
while (in.nextToken() != StreamTokenizer.TT_EOF) {
int a = (int)in.nval;
in.nextToken();
double b = in.nval;
in.nextToken();
String c = in.sval;
/**
* 具体算法实现模块,此处省略......
*
*
*/
out.println(a);
out.println(b);
out.println(c);
out.flush();
}
}
}
我们用同样的算法,同样的OJ平台测试同一道题目
下面是未用输入输出优化的编译结果:
下面是用到输入输出优化的编译结果:
经过测试,可见用StreamTokenizer和PrintWriter进行输入输出有着比较明显的速度提升。
「真诚赞赏,手留余香」
真诚赞赏,手留余香
使用微信扫描二维码完成支付